hdu 2476(第一道区间dp)
题意:就是给定两个字符串,第一个是初始串,第二个是目标串,问你把初始串变到目标串最少需要多少串!
分析:此题分两步,第一步是假设开始的初始串是空串,然后就进行区间dp,dp[i][j]代表把区间[i,j]变到与目标串相同的时候最少需要的步数,所以可以初始化dp[i][j]=dp[i+1][j]+1;
然后如果str2[i]==str2[k]就可以有dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j])。具体看代码实现吧!
代码实现:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int dp[105][105],res[105]; char str1[105],str2[105]; int min(int x,int y) { return x<y?x:y; } int main() { int i,j,k,len; while(scanf("%s%s",str1,str2)!=EOF) { len=strlen(str1); memset(dp,0,sizeof(dp)); for(j=1;j<=len;j++) { for(i=0;i<len-j+1;i++) { dp[i][i+j-1]=dp[i+1][i+j-1]+1; for(k=i+1;k<=i+j-1;k++) { if(str2[i]==str2[k]) dp[i][i+j-1]=min(dp[i][i+j-1],dp[i+1][k]+dp[k+1][i+j-1]); } } } for(i=0;i<len;i++) res[i]=dp[0][i]; for(i=0;i<len;i++) { if(str1[i]==str2[i]) { if(i==0) res[i]=0; else res[i]=res[i-1]; } else { for(j=0;j<i;j++) res[i]=min(res[i],res[j]+dp[j+1][i]); } } printf("%d\n",res[len-1]); } return 0; }
posted on 2014-04-26 16:35 后端bug开发工程师 阅读(2072) 评论(0) 编辑 收藏 举报