51nod 1092 回文字串

2021-08-08 20:38:07 字數 1537 閱讀 6864

1092 回文字串

基準時間限制:1 秒 空間限制:131072 kb 分值: 10 

難度:2級演算法題

回文串是指aba、abba、cccbccc、aaaa這種左右對稱的字串。每個字串都可以通過向中間新增一些字元,使之變為回文字串。

例如:abbc 新增2個字元可以變為 acbbca,也可以新增3個變為 abbcbba。方案1只需要新增2個字元,是所有方案中新增字元數量最少的。

input

輸入乙個字串str,str的長度 <= 1000。
output

輸出最少新增多少個字元可以使之變為回文字串。
input示例

abbc
output示例

2
笨方法                   ans=len-最長公共子串行

#include#include#include#includeusing namespace std;

char a[10001];

char b[10001];

int dp[10001][1001];

int main()

for(int j=1;j<=len;j++)

else}}

int ans=len-dp[len][len];

cout看到了乙個動態規劃的** 看了好半天 

決定複製過來

一道動態規劃題,輔助空間cost[i][j]表示要將從s[j]個字元開始長度為i的子串變為對稱串需要新增的字元個數;這樣,動態方程為:

cost[0][i] = cost[1][i] = 0;//長度為0和長度為1的串

cost[i][j] = 當s[j] == s[i+j-1]時,字串長度加2,需要增加的字元個數相同,即cost[i][j] = cost[i-2][j+1];

否則,cost[i][j] = min + 1;

#include#include#includeusing namespace std;

char s[1002];

int f[1001][1001];

int main()

for(i = 2; i <= n; i++)

for(j = 0; j < n; j++)

else if(f[i-1][j] < f[i-1][j+1])

else f[i][j] = f[i-1][j+1] + 1;

}printf("%d\n", f[n][0]);

//}return 0;

}

還是自己寫的比較精煉

#includeusing namespace std;

char a[10001];

int dp[1001][10001];

int main(){

cin>>a;

int len=strlen(a);

for(int j=2;j<=len;j++){

for(int i=0;i

51nod 1092 回文字串

1092 回文字串 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 收藏 關注 回文串是指aba abba cccbccc aaaa這種左右對稱的字串。每個字串都可以通過向中間新增一些字元,使之變為回文字串。例如 abbc 新增2個字元可以變為 acbbca,也可...

51nod 1092 回文字串

題解 本題要求的是求最小新增的數,那麼可以進行反向的思考,直接算最大的公共長度,然後用總長度 最的公共長度之後,就是答案了。include include include include include using namespace std const int maxn 1000 10 defin...

51nod 1092 回文字串

1092 回文字串 難度 2級演算法題 回文串是指aba abba cccbccc aaaa這種左右對稱的字串。每個字串都可以通過向中間新增一些字元,使之變為回文字串。例如 abbc 新增2個字元可以變為 acbbca,也可以新增3個變為 abbcbba。方案1只需要新增2個字元,是所有方案中新增字...