Make Palindrome UVA - 10453

题意:添加尽量少的字符使得s串成为回文串,并输出这样得解。

题解:dp[ i ][ j ]表示i~j串需要添加的最少字符。

当s[ i ]==s[ j ]时,dp[ i ][ j ]=dp[ i +1 ][ j - 1 ];

当s[ i ]! =s[ j ]时,dp[ i ][ j ]=min( dp[ i ][ j ],min(dp[ i+1 ][ j ],dp[ i ][ j - 1 ]+1);

头疼的是打印解。

(1)顺着刷

 1 void solve(){
 2     for(int i=0;i<n;i++) { dp[i+1][i]=0; dp[i][i]=0; }
 3
 4     for(int len=1;len<n;len++){
 5         for(int i=0;i+len<n;i++){
 6             dp[i][j]=INF;
 7             int j=i+len;
 8             if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1];
 9             else dp[i][j]=min(dp[i][j],min(dp[i+1][j],dp[i][j-1])+1);
10         }
11     }
12     cout<<dp[0][n-1]<<" ";
13 }

(2)逆着刷

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 const int maxn=1005;
 8
 9 int n;
10 int dp[maxn][maxn],rec[maxn][maxn];
11 char s[maxn];
12
13 void solve(){
14     memset(dp,0,sizeof(dp));
15     memset(rec,0,sizeof(rec));
16
17     for(int i=n-1;i>=0;i--){
18         for(int j=i+1;j<n;j++){
19             if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1];
20             else{
21                 if(dp[i+1][j]>dp[i][j-1]){
22                     dp[i][j]=dp[i][j-1]+1;
23                     rec[i][j]=1;
24                 }
25                 else{
26                     dp[i][j]=dp[i+1][j]+1;
27                     rec[i][j]=-1;
28                 }
29             }
30         }
31     }
32     cout<<dp[0][n-1]<<" ";
33 }
34
35 void print(int i,int j){
36     if(i>j) return ;
37     if(i==j) printf("%c",s[i]);
38     else if(rec[i][j]==0){
39         printf("%c",s[i]);
40         print(i+1,j-1);
41         printf("%c",s[i]);
42     }
43     else if(rec[i][j]==1){
44         printf("%c",s[j]);
45         print(i,j-1);
46         printf("%c",s[j]);
47
48     }
49     else{
50         printf("%c",s[i]);
51         print(i+1,j);
52         printf("%c",s[i]);
53     }
54 }
55
56
57 int main()
58 {   while(scanf("%s",s)!=EOF){
59         n=strlen(s);
60
61         solve();
62         print(0,n-1);
63         cout<<endl;
64     }
65     return 0;
66 }
时间: 2024-10-05 22:06:12

Make Palindrome UVA - 10453的相关文章

UVA 10453 十七 Make Palindrome

Make Palindrome Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 10453 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 char str[1005]; 7 in

UVA 10453 Make Palindrome(区间简单DP)

题意:给出一个字符串A,求出需要至少插入多少个字符使得这个字符串变成回文串. 思路:设dp[i][j]为使区间[i, j]变成回文串所需要的最少字符个数. 1.A[i] == A[j的情况]那么dp[i][j] = min(dp[i][j], dp[i + 1][j -1]); 2.或者在第j个位置插入一个字符A[i], dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1); 3.或者在第i个位置插入一个字符A[j], dp[i][j] = min(dp[i][j

uva 10453 Make Palindrome (区间DP + 递归输出)

uva 10453 Make Palindrome 题目大意:给出一段字符串,要求求出最少加入几个字符(任意位置),可以让该字符串变成会问字符串,并输出修改以后的回文字符串. 解题思路:dp[i][j]代表了将该字符串从第i位到第j位变成回文字符串最少要添加的字符.当S[i]==S[j],dp[i][j]=dp[i+1][j?1]当S[i]!=S[j],dp[i][j]=min(dp[i+1][j],dp[i][j?1])+1,在DP的过程中记录对该区间的操作类型,最后递归输出. #includ

UVA 10453 Make Palindrome

Problem A Make Palindrome Input: standard input Output: standard output Time Limit: 8 seconds By definition palindrome is a string which is not changed when reversed. "MADAM" is a nice example of palindrome. It is an easy job to test whether a g

Extend to Palindrome UVA - 11475 (后缀数组)

题面就不弄了 题意:给你一个串,让你求出补充最少的字符形成的回文串 思路:思路很好想,就是对一个串,找其最后一个字符(第一个也行)和原串的反串的最长公共前缀,这样就求出了该串中的已有最长回文,然后把剩下部分 倒序添加到原串上即可. 也就是我们可以固定一个位置,即使反串的第一个单词(原串最后一个),然后从该位置向前向后遍历ht数组直到找到一个属于原串即可. 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring>

优质题表(机密版)

转载请注明出处:http://www.cnblogs.com/dashuzhilin/p/4556803.html 思维题: poj 1528 poj 1597 poj 2538 poj 2608 poj 2612 poj 2361 poj 2339 poj 2664 uva 10894 uva 10921   uva 10922   uva 10929 uva 10931   uva 10800   uva 10878 uva 10976   uva 10323   uva 201 poj 2

uva 10617 Again Palindrome (DP)

uva 10617 Again Palindrome 题目大意:给出一段字符串,可进行删除操作,可以删除任意位置任意个数(可以是0)的字符.问,进行删除操作使原本字符串变成回文字符串,有几种方式. 解题思路: dp[i][j] = 1 (i == j),单独一个字符也是回文字符串 s[i] != s[j]时, dp[i][j] = dp[i + 1][j] + dp[i][j - 1] - dp[i + 1][j - 1], dp[i + 1][j] 和 dp[i][j + 1]的公共部分dp[

Uva - 12050 Palindrome Numbers【数论】

题目链接:uva 12050 - Palindrome Numbers 题意:求第n个回文串 思路:首先可以知道的是长度为k的回文串个数有9*10^(k-1),那么依次计算,得出n是长度为多少的串,然后就得到是长度为多少的第几个的回文串了,有个细节注意的是, n计算完后要-1! 下面给出AC代码: 1 #include <bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 const int maxn=3010; 5

uva 10739 String to Palindrome (dp)

uva 10739 String to Palindrome In this problem you are asked to convert a string into a palindrome with minimum number of operations. The operations are described below: Here you'd have the ultimate freedom. You are allowed to: Add any character at a