UVA 1625 Color Length DP
題目鏈接:?https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4500
題目描述: 兩個(gè)字符串 ,組成一個(gè)新的字符串, 每次只能從其中一個(gè)的開(kāi)頭選一個(gè)加到新的尾, 問(wèn)l(i)的最小值
解題思路: dp(i, j) ?表示從第一個(gè)字符串中取i 個(gè), 第二個(gè)字符串中取j個(gè)時(shí)的最優(yōu)方案, 我們創(chuàng)建數(shù)組c 表示從第一個(gè)字符串中取i 個(gè), 第二個(gè)字符串中取j個(gè)時(shí)開(kāi)始還沒(méi)有結(jié)束的字符的數(shù)量, 這樣狀態(tài)轉(zhuǎn)移方程就可以寫(xiě)成: dp(i,j) = min(dp(i-1,j)+c[i-1,j], dp(i, j-1)+c[i,j-1]) 我們每做一次狀態(tài)轉(zhuǎn)移就更新一次c數(shù)組
代碼:?
#include <iostream> #include <cstdio> #include <string> #include <vector> #include <map> #include <cstring> #include <iterator> #include <cmath> #include <algorithm> #include <stack> #include <deque> #include <map>#define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 typedef long long LL; using namespace std; const int maxn = 5000+5;int dp[maxn][maxn]; // dp(i,j) p中取i個(gè), q中取j個(gè)的最小代價(jià) char p[maxn]; char q[maxn]; int c[maxn][maxn]; // c(i,j) p中取i個(gè), q中取j個(gè)已經(jīng)開(kāi)始還沒(méi)有結(jié)束字符的個(gè)數(shù) int sp[30], sq[30], ep[30], eq[30]; const int INF = 0x3fffffff;int main() {int t;scanf( "%d", &t );while( t-- ) { // scanf( "%s", p+1); // scanf( "%s", q+1);scanf("%s%s", p + 1, q + 1);int n = (int)strlen(p+1);int m = (int)strlen(q+1);memset(c, 0, sizeof(c));memset(dp, 0, sizeof(dp));for( int i = 1; i <= n; i++ ) p[i] -= 65;for( int j = 1; j <= m; j++ ) q[j] -= 65;for( int i = 0; i < 26; i++ ) {sp[i] = sq[i] = INF;ep[i] = eq[i] = 0;}for( int i = 1; i <= n; i++ ) {sp[p[i]] = min( sp[p[i]], i );ep[p[i]] = i;}for( int i = 1; i <= m; i++ ) {sq[q[i]] = min( sq[q[i]], i );eq[q[i]] = i;}for( int i = 0; i <= n; i++ ) {for( int j = 0; j <= m; j++ ) {if( !i && !j ) continue;int v1, v2;v1 = v2 = INF;if( i ) v1 = dp[i-1][j] + c[i-1][j];if( j ) v2 = dp[i][j-1] + c[i][j-1];dp[i][j] = min( v1, v2 );if( i ) {c[i][j] = c[i-1][j]; // if( sp[p[i]] == i && (ep[p[i]] > i || eq[p[i]] > j ) ) c[i][j]++; // if( ep[p[i]] == i && eq[p[i]] <= j ) c[i][j]--;if (sp[p[i]] == i && sq[p[i]] > j) c[i][j]++;if (ep[p[i]] == i && eq[p[i]] <= j) c[i][j]--;}else if( j ) {c[i][j] = c[i][j-1]; // if( sq[q[j]] == j && (eq[q[j]] > j || ep[q[j]] > i ) ) c[i][j]++; // if( eq[q[j]] == j && ep[q[j]] <= i ) c[i][j]--;if (sq[q[j]] == j && sp[q[j]] > i) c[i][j]++;if (eq[q[j]] == j && ep[q[j]] <= i) c[i][j]--;}}}printf( "%d\n", dp[n][m] );}return 0; } View Code思考:狀態(tài)轉(zhuǎn)移時(shí), 要注意和狀態(tài)轉(zhuǎn)移有關(guān)的變量有哪幾個(gè), 是否能夠從原條件中預(yù)處理出來(lái), 如果能夠預(yù)處理出來(lái)就去做, 否則就換狀態(tài)
轉(zhuǎn)載于:https://www.cnblogs.com/FriskyPuppy/p/7323400.html
總結(jié)
以上是生活随笔為你收集整理的UVA 1625 Color Length DP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 路由器怎么当交换机使用 路由器怎么能当交
- 下一篇: T4生成多文件时,不生成自己