ZOJ 1642 Match for Bonus

本文介绍了一个基于最长公共子序列模型的动态规划问题解决方案。通过一个具体示例,展示了如何使用二维数组进行状态转移,实现对字符价值的最大化计算。

DP水题。最长公共子序列,稍稍变形即可。模型完全一样。

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 #define MAX 2012
 5 int dp[MAX][MAX],v[200];
 6 char a[MAX],b[MAX];
 7 int main()
 8 {
 9     int n,i,j;
10     while(cin>>n)
11     {
12         char ch;
13         int value;
14         memset(v,0,sizeof(0));
15         memset(dp,0,sizeof(0));
16         for(i = 1;i <= n;i++)
17         {
18             cin>>ch;
19             cin>>value;
20             v[ch] = value;
21         }
22         cin>>a>>b;
23         int lena = strlen(a);
24         int lenb = strlen(b);
25         int len = max(lena,lenb);
26         int ans = 0;
27         for(i = 1;i <= len;i++)
28             for(j = 1;j <= len;j++)
29             {
30                 dp[i][j] = max(dp[i - 1][j],dp[i][j - 1]);
31                 if(a[i - 1] == b[j - 1])
32                     dp[i][j] = max(dp[i][j],dp[i - 1][j - 1] + v[a[i - 1]]);
33                 if(dp[i][j] > ans)
34                     ans = dp[i][j];
35             }
36         cout<<ans<<endl;
37     }
38     return 0;
39 }

 

转载于:https://www.cnblogs.com/zhexipinnong/archive/2012/04/11/2442471.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值