首页 > 其他 > 详细

Aizu2130-Billion Million Thousand-dp

时间:2016-02-21 18:28:56      阅读:250      评论:0      收藏:0      [点我收藏+]

用dp求出最大的表达,再用dp求出。//然而并没有想出来

 1 #include <cstdio>
 2 #include <string>
 3 #include <algorithm>
 4 #include <iostream>
 5 
 6 using namespace std;
 7 
 8 const int INF = 0x3f3f3f3f;
 9 const int maxn = 2000;
10 
11 int N,v[maxn],len[maxn];
12 int dp[maxn];
13 
14 string s[maxn],str;
15 
16 int main()
17 {
18     int cas = 1;
19     while(cin >> N && N)
20     {
21         for(int i=0;i<N;i++)
22         {
23             cin >> s[i] >> v[i];
24             len[i] = s[i].length();
25         }
26         cin >> str;
27         int length = str.length();
28 
29         for(int i=0;i<=length;i++) dp[i] = -INF;
30         dp[0] = 0;
31 
32         for(int i=0;i<=length;i++)
33         {
34             for(int j=0;j<N;j++)
35             {
36                 int End = i - len[j];
37                 if(End>=0 && dp[End]>=0 && str.substr(End,len[j]) == s[j])
38                     {dp[i] = max(dp[i],dp[End]+v[j]);}
39             }
40         }
41 
42         int mx = dp[length];
43 
44         for(int i=0;i<=mx;i++) dp[i] = INF;
45         dp[0] = 0;
46 
47         for(int i=0;i<N;i++)
48         {
49             for(int j=0;j<=mx-v[i];j++)
50                 dp[j+v[i]] = min(dp[j+v[i]] , dp[j]+len[i]);
51         }
52         cout << "Case "<<cas++<< ": " << dp[mx] << endl;
53     }
54 }

 

Aizu2130-Billion Million Thousand-dp

原文:http://www.cnblogs.com/helica/p/5205212.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!