UVALive 6697 Homework Evaluation

Homework Evaluation

Time Limit: 3000ms
Memory Limit: 131072KB
This problem will be judged on UVALive. Original ID: 6697
64-bit integer IO format: %lld      Java class name: Main
 
 
解题:dp或者dp
$O(n^3)算法$
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 200;
 4 int dp[maxn][maxn];
 5 char sa[maxn],sb[maxn];
 6 int main() {
 7     int kase,a,b;
 8     scanf("%d",&kase);
 9     while(kase--) {
10         scanf("%s%s",sa,sb);
11         a = strlen(sa);
12         b = strlen(sb);
13         memset(dp,0,sizeof dp);
14 
15         int ans = -0x3f3f3f3f;
16         for(int i = 1; i <= b; ++i) dp[0][i] = -3*i - 4;
17         for(int i = 1; i <= a; ++i) {
18             for(int j = 1; j <= b; ++j) {
19                 if(sa[i-1] == sb[j-1]) dp[i][j] = dp[i-1][j-1] + 8;
20                 else dp[i][j] = dp[i-1][j-1] - 5;
21                 for(int k = 0; k < i; ++k)
22                     dp[i][j] = max(dp[i][j],dp[k][j] - 4 - (i - k)*3);
23                 for(int k = 0; k < j; ++k)
24                     dp[i][j] = max(dp[i][j],dp[i][k] - 4 - (j - k)*3);
25             }
26             ans = max(ans,dp[i][b]);
27         }
28         cout<<ans<<endl;
29     }
30     return 0;
31 }
View Code

$O(n^2)算法$

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int INF = 0x3f3f3f3f;
 4 
 5 const int maxn = 200;
 6 int dp[maxn][maxn][2];
 7 char sa[maxn],sb[maxn];
 8 int main() {
 9     int kase;
10     scanf("%d",&kase);
11     while(kase--) {
12         scanf("%s%s",sa,sb);
13         int a = strlen(sa);
14         int b = strlen(sb);
15         memset(dp,-0x3f,sizeof dp);
16         int ret = -INF;
17         dp[0][0][1] = 0;
18         for(int i = 1; i <= a; ++i) {
19             dp[i][0][1] = 0;
20             for(int j = 1; j <= b; ++j) {
21                 int tmp = sa[i-1] == sb[j-1]?8:-5;
22                 dp[i][j][1] = tmp + max(dp[i-1][j-1][0],dp[i-1][j-1][1]);
23                 dp[i][j][0] = max(dp[i-1][j][1] - 7,dp[i-1][j][0] - 3);
24                 dp[i][j][0] = max(dp[i][j][0],dp[i][j-1][1] - 7);
25                 dp[i][j][0] = max(dp[i][j][0],dp[i][j-1][0] - 3);
26             }
27             ret = max(ret,dp[i][b][1]);
28         }
29         cout<<ret<<endl;
30     }
31     return 0;
32 }
View Code

 

posted @ 2015-10-04 18:07  狂徒归来  阅读(253)  评论(0编辑  收藏  举报