zoukankan      html  css  js  c++  java
  • la4394

    题解:

    首先区间dp是比较好想到的

    然后我感觉接下来就是乱搞。。。

    我们会发现接下来的操作 无非就是 用一种颜色去覆盖这整个区间 然后在做

    于是我用了比较暴力的做法,f[i][j][k]表示i-j这段区间被k颜色完全覆盖

    那么转移就是枚举f[i][kk][k] f[kk+1][j][k]

    另外要注意还有同层之间可以用全部覆盖成一个颜色来转移

    最后再跑一遍dp(这时候已知了g[i][j] (覆盖i-j的最小值))

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define rint register int 
    #define IL inline
    #define rep(i,h,t) for (rint i=h;i<=t;i++)
    #define dep(i,t,h) for (rint i=t;i>=h;i--)
    char s1[200],s2[200];
    int f[200][200][27],g[200][200],p[200];
    const int INF=1e9;
    int main()
    {
      freopen("1.in","r",stdin);
      freopen("1.out","w",stdout);
      ios::sync_with_stdio(false);
      while( cin>>s1>>s2)
      {
      int n=strlen(s1);
      dep(i,n,1) s1[i]=s1[i-1],s2[i]=s2[i-1];
      rep(i,1,n)
        rep(j,i+1,n) g[i][j]=INF;
      rep(i,1,n)
      {
        rep(k,0,25) f[i][i][k]=2;
        f[i][i][s2[i]-'a']=1;
        if (s1[i]==s2[i]) g[i][i]=0; else g[i][i]=1;
      }
      rep(i,2,n)
        rep(j,1,n-i+1)
        {
          int h=j,t=j+i-1;
          rep(k,0,25)
          {
            f[h][t][k]=INF;
            rep(k1,h,t-1)
            {
              f[h][t][k]=min(f[h][t][k],f[h][k1][k]+f[k1+1][t][k]-1);
            }
            g[h][t]=min(g[h][t],f[h][t][k]);
          }
          rep(k,0,25) f[h][t][k]=min(f[h][t][k],g[h][t]+1); 
        } 
      rep(i,1,n)
      {
        p[i]=INF;
        rep(j,0,i-1)
          p[i]=min(p[i],p[j]+g[j+1][i]);
      }
      cout<<p[n]<<endl;
      }
      return 0;
    }
  • 相关阅读:
    Pandas对于CSV的简单操作
    前端之BOM和DOM
    前端之JavaScript
    前端之CSS初识
    定时ping取返回值并绘图
    etree不存在解决方法
    内置方法练习(一)
    pip使用
    python变量、变量属性
    python 爬取段子网段子写入文件
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/9691673.html
Copyright © 2011-2022 走看看