Homework Evaluation
Time Limit: 3000ms
Memory Limit: 131072KB
This problem will be judged on UVALive. Original ID: 669764-bit integer IO format: %lld Java class name: Main
![](https://images2015.cnblogs.com/blog/648385/201510/648385-20151004180436965-402745211.png)
解题:dp或者dp
$O(n^3)算法$
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
$O(n^2)算法$
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }