您的位置:首页 > 其它

ZOJ 1642 Match for Bonus

2010-07-14 08:59 435 查看
最长公共子序列的变形,其实思想上都是一样的,LCS是在字符相同时加1,而这个题是加上题目中给出的bonus.

#include<stdio.h>
int Nchar;
char a[2005],b[2005];
int lena,lenb;
char chars[100];
int bonus[100];
int opt[2005][2005];
int nLen1,nLen2;
int search(char a)  //找出字符对应的bonus
{
int i;
for(i = 1;i <= Nchar;i++)
if(chars[i] == a ) return bonus[i];
}
int main(void)
{
int i,j;
while(scanf("%d",&Nchar) != EOF)
{
for( i = 1 ; i <= Nchar ; i++ )
{
getchar();
chars[i] = getchar();
scanf("%d",&bonus[i]);
}
scanf("%s%s",a+1,b+1);
lena = strlen(a+1);
lenb = strlen(b+1);

for( i = 0 ; i <= lena ; i++ )
opt[0][i] = 0;
for( i = 0 ; i <= lenb ; i++ )
opt[i][0] = 0;

for( i = 1 ; i <= lena ; i++ )//关键代码
{
for( j = 1 ; j <= lenb ; j++ )
{
if(a[i] == b[j])
opt[i][j] = opt[i-1][j-1] + search(a[i]);//LCS这里是加1
else
{
nLen1 = opt[i][j-1];
nLen2 = opt[i-1][j];

opt[i][j] = nLen1>nLen2?nLen1:nLen2;
}
}
}
printf("%d/n",opt[lena][lenb]);
}

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