蓝桥杯 密码脱落 动态规划! 贪心不对!

一开始自己也没做出来 看了网上题解大部分都是贪心(从字符串的两端向中间比较,如果相同的话,就继续比较,不用的话 比较修改左边和右边需要的字符数量,选择少的那一边,然后从相同的字符处继续比较直到比较完成。
),就跟着思想敲了代码提交WA了好几次,最后请教大佬 才知道贪心不对,贪心只是满足局部最优,不满足整体最优。
真的是好气 也太误导人了,网上很多东西都是错的 作者自己想不明白 就写, 也有可能是数据水了 让他都过了 所以他认为就是对的了
废话不多说
dp做: 将字符串倒过来 然后找两个串的最长公共子串,答案就是串长-最长公共字串串长

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	char s1[1005],s2[1005];
	int dp[1005][1005],i,j,len;
	cin>>s1;
	len=strlen(s1);
	for(i=0;i<len;i++)
		s2[i]=s1[len-1-i];    //这里有个疑问  一开始定义的string类型的串 复制不成功(空串),改成char就行了
	memset(dp,0,sizeof(dp)); 
	for(i=1;i<=len;i++)
		for(j=1;j<=len;j++)
		{
			if(s1[i-1]==s2[j-1])
				dp[i][j]=dp[i-1][j-1]+1;
			else 
				dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
		}
	cout<<len-dp[len][len];
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41214789/article/details/87780988
今日推荐