区间DP poj 2955 hdu 2476
2015-06-13 10:42
453 查看
区间DP以前 其实我都没怎么做过 因为队里面一直有人会 就一直没去看他 - =
写了一道入门题 和 上次没过的那题 大致有个了解了吧!
其实感觉有点像以前讲的 分治算法 对于每个区间里 找一个最优点 将两边分开 得到这个区间最优值
poj 2955
题意:最大的括号匹配
思路:要么合并区间,要么判断区间两个端点是否合法,dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k][j]+2)
hdu 2476
这题其实本来已经想到但是又被自己否决 - =!! 好气啊!!后来看了一下别人的第一句思路,就后悔死了~~~
题意:给出两串字符,要你将第一串字符变成第二串字符,每次可以改变连续的一个或多个字符,求最少的修改次数
(题意就直接黏贴别人的吧)
思路:首先得出凭空构造第二个串任意一个区间需要多少,到底需要多少步骤。得出以后枚举区间每一个点,是否和原来的相等,如果相等的话
dp[j][i+j]=min(dp[j][i+j],dp[j][k-1]+dp[k+1][i+j]);
(i-i+j k 是分隔点)
写了一道入门题 和 上次没过的那题 大致有个了解了吧!
其实感觉有点像以前讲的 分治算法 对于每个区间里 找一个最优点 将两边分开 得到这个区间最优值
poj 2955
题意:最大的括号匹配
思路:要么合并区间,要么判断区间两个端点是否合法,dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k][j]+2)
<pre name="code" class="cpp">#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <map> using namespace std; #define maxn 105 char ch[maxn]; int dp[maxn][maxn]; bool judge(char c1,char c2) { if(c1=='('&&c2==')') return true; if(c1=='['&&c2==']') return true; return false; } int main() { while(scanf("%s",ch)) { if(strcmp(ch,"end")==0)break; memset(dp,0,sizeof(dp)); for(int i=1;ch[i];i++) { for(int j=0;ch[j+i];j++) { for(int k=j;k<i+j;k++) { dp[j][j+i]=max(dp[j][j+i],dp[j][k]+dp[k+1][i+j]); if(judge(ch[j],ch[i+j])) { dp[j][j+i]=max(dp[j][j+i],dp[j+1][j+i-1]+2); } } } } int len=strlen(ch); printf("%d\n",dp[0][len-1]); } return 0; }
hdu 2476
这题其实本来已经想到但是又被自己否决 - =!! 好气啊!!后来看了一下别人的第一句思路,就后悔死了~~~
题意:给出两串字符,要你将第一串字符变成第二串字符,每次可以改变连续的一个或多个字符,求最少的修改次数
(题意就直接黏贴别人的吧)
思路:首先得出凭空构造第二个串任意一个区间需要多少,到底需要多少步骤。得出以后枚举区间每一个点,是否和原来的相等,如果相等的话
dp[j][i+j]=min(dp[j][i+j],dp[j][k-1]+dp[k+1][i+j]);
(i-i+j k 是分隔点)
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <map> using namespace std; #define maxn 105 char ch1[maxn],ch2[maxn]; int dp[maxn][maxn]; int main() { while(scanf("%s%s",ch1,&ch2)!=EOF) { memset(dp,0x3f,sizeof(dp)); int len=strlen(ch1); for(int i=0;i<len;i++) { dp[i][i]=1; } for(int i=1;i<len;i++) { for(int j=0;i+j<len;j++) { for(int k=j;k<i+j;k++) { dp[j][i+j]=min(dp[j][i+j],dp[j][k]+dp[k+1][i+j]); if(ch2[j]==ch2[i+j]) { dp[j][i+j]=min(dp[j][i+j],dp[j][i+j-1]); dp[j][i+j]=min(dp[j][i+j],dp[j+1][i+j]); } } } } for(int i=0;i<len;i++) { for(int j=0;i+j<len;j++) { for(int k=j;k<=i+j;k++) { dp[j][i+j]=min(dp[j][i+j],dp[j][k]+dp[k+1][i+j]); if(ch1[k]==ch2[k]) { if(i==0) dp[j][j]=0; else { dp[j][i+j]=min(dp[j][i+j],dp[j][k-1]+dp[k+1][i+j]); } } } } } printf("%d\n",dp[0][len-1]); } return 0; }
相关文章推荐
- POJ 1159
- Brackets Sequence
- UVALive 4394 String painter
- hdu 4745 Two Rabbits
- ZOJ 3541 The Last Puzzle
- Code Jam 2009 Round1C Problem C. Bribe the Prisoners —— 区间DP
- UVA 10003 —— 区间DP
- POJ 3042 Grazing on the Run (区间DP)
- UVA 10003 Cutting Sticks(区间dp)
- SPOJ - GCJ1C09C Bribe the Prisoners
- NYOJ15 - UVA1626 括号匹配问题(区间dp)
- wikioi 1154 - 能量项链 (环形区间dp)
- POJ 1651 - Multiplication Puzzle(区间DP,矩阵链乘三种模版详解)
- SMU 1106 - 凸多边形的最优三角剖分问题(区间DP)
- wikioi1085 - 数字游戏(区间DP或者划分DP)
- POJ 1179 Polygon 区间DP
- NYOJ 括号匹配(二) 区间DP
- HDU1513:Palindrome
- CodeForces 245H
- hdu4283(区间DP)