zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【C++注意事项】1 数据类型及类型转换
    【万里征程——Windows App开发】动态磁贴
    背包问题
    Fence Repair
    Saruman's Army
    字典序最小问题——Best Cow Line
    区间调度问题
    硬币问题
    数据库查询优化的一些总结
    关于减少BUG的思考
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4854785.html
Copyright © 2011-2022 走看看