• HDU 2476 String painter (区间DP)


    题意:给定两个串,问你从第一个串刷成第二个串最少要几次。

    析:我们可以先求一个空串变成第二个串,然后再求第一个串的,dp[i][j] 表示 i-j 这个区间已经和第二个串相同了,最少要几次,区间dp么,

    然后再求和第一个的。

    代码如下:

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <cstring>
    #include <set>
    #include <queue>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <cctype>
    #include <cmath>
    #include <stack>
    #include <sstream>
    #define debug() puts("++++");
    #define gcd(a, b) __gcd(a, b)
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define freopenr freopen("in.txt", "r", stdin)
    #define freopenw freopen("out.txt", "w", stdout)
    using namespace std;
    
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef pair<int, int> P;
    const int INF = 0x3f3f3f3f;
    const LL LNF = 1e16;
    const double inf = 0x3f3f3f3f3f3f;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int maxn = 100 + 10;
    const int mod = 1e9 + 7;
    const int dr[] = {-1, 0, 1, 0};
    const int dc[] = {0, 1, 0, -1};
    const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
    int n, m;
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    inline bool is_in(int r, int c){
      return r >= 0 && r < n && c >= 0 && c < m;
    }
    int dp[maxn][maxn], ans[maxn];
    char a[maxn], b[maxn];
    
    int main(){
      while(scanf("%s", a) == 1){
        scanf("%s", b);
        memset(dp, 0, sizeof dp);
        n = strlen(a);
        for(int i = 0; i < n; ++i)  dp[i][i] = 1;
        for(int l = 1; l < n; ++l)
          for(int i = 0; i + l < n; ++i){
            int j = i + l;
            dp[i][j] = dp[i+1][j] + 1;
            for(int k = i+1; k <= j; ++k)
              dp[i][j] = min(dp[i][j], dp[i+1][k] + dp[k+1][j] + (b[i] != b[k]));
          }
    
        for(int i = 0; i < n; ++i){
          ans[i] = dp[0][i];
          if(a[i] == b[i])  ans[i] = i == 0 ? 0 : ans[i-1];
          for(int j = 0; j < i; ++j)
            ans[i] = min(ans[i], ans[j] + dp[j+1][i]);
        }
        printf("%d
    ", ans[n-1]);
      }
      return 0;
    }
    

      

  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/6853325.html
Copyright © 2020-2023  润新知