HDU2476:区间DP

HDU2476

题解

  • 首先将空串刷成目标串的最小方案数。
  • 对于abbaa,我们两次就可以搞定。aaaaa-->abbaa,一次性连续刷一段,再刷中间。从头开始一段段刷是最差的方法。
  • 再从给定串刷到目标串的最优方案。

代码

#include <bits/stdc++.h>
using namespace std;
int const N = 100 + 10;
char s1[N],s2[N];
int dp[N][N],ans[N];
int main(){
	while(~scanf(" %s%s",&s1,&s2)){	
		memset(dp,0,sizeof(dp));
		int len = strlen(s1);
		for(int i=len-1;i>=0;i--){  //从空串刷成目标串的次数
			for(int j=i;j<len;j++){
				dp[i][j] = dp[i+1][j] + 1;  //直接单独刷,不考虑连续的字母
				for(int k=i+1;k<=j;k++)
					if(s2[i] == s2[k])  //从i连续刷到k
						dp[i][j] = min(dp[i][j],dp[i+1][k] + dp[k+1][j]);
			}
		}
		for(int i=0;i<len;i++){
			if(s1[i] == s2[i])
				ans[i] = ans[i-1];
			else{
				ans[i] = dp[0][i];  //最差的方案。
				for(int j=0;j<i;j++)
					ans[i] = min(ans[i],ans[j] + dp[j+1][i]);
			}
		}
		printf("%d\n",ans[len-1]);
	}
	return 0;
}

 

猜你喜欢

转载自blog.csdn.net/weixin_42264485/article/details/89225369