您的位置:首页 > 其它

UVA1625Color Lenth(DP+LCS变形 未AC)

2016-01-30 18:28 302 查看
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/C

紫书P276

res[i][j]表示第一个序列移动i个,第二个序列移动j个之后有几个已经出现但尚未结束,dp[i][j]表示第一个序列移动i个,第二个序列移动j个之后的总长度

dp[i][j] = min(dp[i - 1][j],dp[i][j - 1]) + res[i][j]

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 5000 + 10;
const int INF = 0x3f3f3f3f;
char str1[MAX],str2[MAX];
int dp[MAX][MAX],res[MAX][MAX];
int start1[30],End1[30],start2[30],End2[30],vis[30];
int n,m;
int main()
{
int tase;
scanf("%d", &tase);
while(tase--)
{
scanf("%s%s", str1 + 1,str2 + 1);
n = strlen(str1 + 1);
m = strlen(str2 + 1);
memset(vis, 0, sizeof(vis));
memset(End1, -1, sizeof(End1));
memset(End2, -1, sizeof(End2));
for(int i = 0; i < 27; i++)
start1[i] = start2[i] = INF;
for(int i = 1; i <= n; i++)
{
if(start1[str1[i] - 'A'] == INF)
start1[str1[i] - 'A'] = i;
End1[str1[i] - 'A'] = i;
}
for(int i = 1; i <= m; i++)
{
if(start2[str2[i] - 'A'] == INF)
start2[str2[i] - 'A'] = i ;
End2[str2[i] - 'A'] = i;
}

memset(res, 0, sizeof(res));
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= m; j++)
{
int cnt = 0;
for(int k = 0; k < 26; k++)
{
if(start1[k] == INF && start2[k] == INF)
continue;
if(start1[k] > i && start2[k] > j)
continue;
if(End1[k] <= i && End2[k] <= j)
continue;
cnt++;
}
res[i][j] = cnt;
}
}

dp[0][0] = 0;
for(int i = 1; i <= m ; i++)
dp[0][i] = dp[0][i - 1] + res[0][i];
for(int j = 1; j <= n; j++)
dp[j][0] = dp[j - 1][0] + res[j][0];
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + res[i][j];
}
}

printf("%d\n", dp
[m]);

}

return 0;
}


TLE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: