南阳理工学院动态规划专题 回文字符串
这个问题使用动态规划求解,dp[i][j]表示字符串下标为i的字符和下标为j的字符区间内构成回文所需加入的最少的字符串。
当str[i]==str[j]时,则dp[i][j]=dp[i+1][j-1],当str[i]!=str[j]时,dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1),初始化时候,d[i][i]=0,d[i][i+1]=1(这里真是纠结了一个多小时,我还以为我转移方程错了!!!)。输出dp[0][strlen(str)-1].
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char str[1001]; int dp[1001][1001]; int main() { int cas; cin>>cas; while(cas--) { cin>>str; int l=strlen(str); for(int i=0;i<l;i++) { dp[i][i]=0; } for(int i=0;i<l-1;i++) { if(str[i]==str[i+1]) dp[i][i+1]=0; else dp[i][i+1]=1; } for(int k=2;k<l;k++) { for(int i=0;i+k<l;i++) { int j=i+k; if(str[i]==str[j]) { dp[i][j]=dp[i+1][j-1]; } else { dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1); } } } // for(int i=0;i<l;i++) // { // for(int j=0;j<l;j++) // cout<<dp[i][j]<<' '; // cout<<endl; // } cout<<dp[0][l-1]<<endl; } }
回文字符串
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
- 输入
- 第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000. - 输出
- 每行输出所需添加的最少字符数
- 样例输入
-
1 Ab3bd
- 样例输出
-
2
- 来源
- IOI 2000
- 上传者
- hzyqazasdf