AcWing 1222. 密码脱落(跟y总不一样的状态表示)
原题链接
中等
作者:
Anoxia_3
,
2021-04-03 15:08:45
,
所有人可见
,
阅读 1546
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
int f[N][N];//f[l][r]:表示将s[l~r]变成镜像串的最小操作数
/*
状态转移方程:
①s[l] == s[r],此时可以直接从f[l + 1][r - 1]转移而来,并且操作数不用变
②s[l] != s[r],此时可以选择从f[l + 1][r] 或 f[l][r - 1]转移而来,并且操作数+1
*/
string s;
int main()
{
cin >> s;
int n = s.size();
memset(f , 0x3f , sizeof f);
for(int len = 0 ; len <= n ; len++)
for(int l = 0 ; l + len - 1 < n ; l++)
{
int r = l + len - 1;
if(len <= 1) f[l][r] = 0;//长度为1或0就是镜像串
else
{
if(s[l] == s[r]) f[l][r] = min(f[l][r] , f[l + 1][r - 1]);
else f[l][r] = min(f[l][r] , min(f[l + 1][r] , f[l][r - 1]) + 1);
}
}
cout << f[0][n - 1] << endl;
}
for(int len = 0 ; len <= n ; len)
for(int l = 0 ; l + len - 1 < n ; l) 大佬,为啥把里面的n改为s.size()代码就错误了
s.size()返回的是size_type类型,标准库将size_type定义为unsigned的类型,在循环中会有 0 + 0 - 1 < s.size() 即
-1 < s.size(), -1转化为unsigned类型比s.size()表示的数值要大,进入不了循环
string s = “123456”;
int n = s.size();
cout << (-1 < n) << endl;
cout << (-1 < s.size()) << endl; 可以运行这个看看效果
好的,感谢兄弟!
正解应该是 f[i][j] 初始化为0,然后len从1开始增加
为什么len要从0开始
他这个地方很歧义,就是l不一定大于r,len等于0的情况相当于
###
for(int i=1;i+1<=n;i++){
if(str[i]==str[i+1]) dp[i][i+1]=0,dp[i+1][i]=0;
}
###
就是最开始的边界情况有存在当AA这种情况时要特判下
本质上还是求了一个最长回文子序列
#include [HTML_REMOVED]
#include [HTML_REMOVED]
using namespace std;
const int N = 1010;
int f[N][N];//f[l][r]:表示将s[l~r]变成镜像串的最小操作数
/*
状态转移方程:
①s[l] == s[r],此时可以直接从f[l + 1][r - 1]转移而来,并且操作数不用变
②s[l] != s[r],此时可以选择从f[l + 1][r] 或 f[l][r - 1]转移而来,并且操作数+1
*/
string s;
int main()
{
cin >> s;
int n = s.size();
memset(f , 0x3f , sizeof f);
}
为什么我的不对
len 的判断写的不一样,我也不太懂len == 0时候的作用,如果l枚举到0并且len枚举的是0的时候,r 等于-1不会出问题吗?
if(s[l] == s[r]) f[l][r] = f[l + 1][r - 1];
l+1可能大于r-1