UVA11584-Partitioning by Palindromes(动态规划基础)
Posted npugen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA11584-Partitioning by Palindromes(动态规划基础)相关的知识,希望对你有一定的参考价值。
Accept: 1326 Submit: 7151
Time Limit: 3000 mSec
Problem Description
Input
Your program is to read from standard input. The input consists of T test cases. The number of test cases T is given in the ?rst line of the input. Each test case consists of two lines. In the ?rst line, a character string of length n (1 ≤ n ≤ 5,000) that is the color information of the cars in one lane before merging is given. In the second line, a character string of length m (1 ≤ m ≤ 5,000) that is the color information of the cars in the other lane is given. Every color is represented as an uppercase letter in English, hence the number of colors is less than or equal to 26.
Output
Sample Input
AAABBCY
ABBBCDEEY
GBBY
YRRGB
Sample Output
10
12
题解:这个题真是醉了,自己想状态,总有后效性,想了很久还是看了lrj的思路,恍然大悟,还是很有启发性的,局部有后效性,但是整体上没有,不失为以后考虑问题的一个思路,本以为这个题已经没啥说的了,写的时候才发现细节太多了,if 、else写到恶心,还一直有不对的地方,后来在不断调试过程中发现问题主要出现在只出现在一个字符串中的字符上,想出了一个很好的解决方案,就是将第一次出现的地方初始化为INF,没出现就代表着出现在无穷远处,将最后出现的地方初始化为0,没出现就代表着在最前面结束,有了这个初始化就好写很多,调一调就好,dp相对转移起来还是比较简单的,方程见代码。
1 #include <bits/stdc++.h> 2 //#define DE 3 4 using namespace std; 5 6 const int maxn = 5000 + 10; 7 const int kind = 256; 8 const int INF = 0x3f3f3f3f; 9 10 char a[maxn], b[maxn]; 11 int num[maxn][maxn], dp[maxn][maxn]; 12 int st[2][kind], tail[2][kind]; 13 int alen, blen; 14 15 void pre_management(int p, char *str) { 16 int len = strlen(str + 1); 17 for (int i = 1; i <= len; i++) { 18 if (st[p][str[i]] == INF) st[p][str[i]] = i; 19 } 20 for (int i = len; i >= 1; i--) { 21 if (tail[p][str[i]] == 0) tail[p][str[i]] = i; 22 } 23 } 24 25 void init() { 26 memset(st, INF, sizeof(st)); 27 memset(tail, 0, sizeof(tail)); 28 pre_management(0, a); pre_management(1, b); 29 30 int cnt = 0; 31 for (int i = 0; i <= alen; i++) { 32 for (int j = 0; j <= blen; j++) { 33 if (i) { 34 num[i][j] = num[i - 1][j]; 35 if (i == st[0][a[i]] && j < st[1][a[i]]) num[i][j]++; 36 if (i == tail[0][a[i]] && j >= tail[1][a[i]]) num[i][j]--; 37 } 38 if (j) { 39 num[i][j] = num[i][j - 1]; 40 if (j == st[1][b[j]] && i < st[0][b[j]]) num[i][j]++; 41 if (j == tail[1][b[j]] && i >= tail[0][b[j]]) num[i][j]--; 42 } 43 } 44 } 45 } 46 47 void solve() { 48 dp[0][0] = 0; 49 for (int i = 0; i <= alen; i++) { 50 for (int j = 0; j <= blen; j++) { 51 if (!i && !j) continue; 52 dp[i][j] = INF; 53 if (i) { 54 dp[i][j] = min(dp[i - 1][j] + num[i][j], dp[i][j]); 55 } 56 if (j) { 57 dp[i][j] = min(dp[i][j - 1] + num[i][j], dp[i][j]); 58 } 59 } 60 } 61 printf("%d ", dp[alen][blen]); 62 } 63 64 int main() 65 { 66 //freopen("input.txt", "r", stdin); 67 int iCase; 68 scanf("%d", &iCase); 69 while (iCase--) { 70 scanf("%s%s", a + 1, b + 1); 71 alen = strlen(a + 1), blen = strlen(b + 1); 72 init(); 73 solve(); 74 #ifdef DE 75 for (int i = 1; i <= alen; i++) { 76 for (int j = 1; j <= blen; j++) { 77 printf("num[%d][%d]: %d ", i, j, num[i][j]); 78 } 79 printf(" "); 80 } 81 for (int i = 1; i <= alen; i++) { 82 for (int j = 1; j <= blen; j++) { 83 printf("%d ", num[i][j]); 84 } 85 printf(" "); 86 } 87 #endif // DE 88 } 89 return 0; 90 }
以上是关于UVA11584-Partitioning by Palindromes(动态规划基础)的主要内容,如果未能解决你的问题,请参考以下文章
UVA11584-Partitioning by Palindromes(动态规划基础)
题解UVA11584 Partitioning by Palindromes
uva 11584 Partitioning by Palindromes 线性dp
UVA 11584Partitioning by Palindromes