zoukankan      html  css  js  c++  java
  • <SCOI2009>粉刷匠の思路

    emm.dp真的是写不来啊难过

    不边写边注释我就挂了

    #include<cstdio>
     #include<cstring>
     #include<iostream>
     #include<algorithm>
     using namespace std;
     int f[55][2510],g[55][55],c[55]/*为第n行需要改变的次数就是颜色变了的次数*/,dp[2510],crt[55][2510];
     int n,m,t;
     int main()
     {
        int i,j,k,l;
         scanf("%d%d%d",&n,&m,&t);
         memset(c,0,sizeof(c));
         for(i=1;i<=n;i++)
             for(j=1;j<=m;j++)
             {    
                 scanf("%1d",&g[i][j]);
                 if(j==1||g[i][j]!=g[i][j-1])c[i]++;//换新一行或颜色改变时 
             }
         for(l=1;l<=n;l++)//枚举行数 
         {
             memset(f,0,sizeof(f));
             for(i=1;i<=m;i++)//枚举每前i个数的情况 
                 for(j=1;j<=c[l];j++)//该行改变j次时(最多只需要改变mx[l]次!!
                 {
                     int sum=0; 
                     for(k=i;k>=j;k--)
                     {
                         if(g[l][k]==g[l][i])sum++;//i和k颜色相同sum++ 
                         f[i][j]=max(f[i][j],f[k-1][j-1]+sum);//前k个数在不变色的情况下再涂k~i,同色!加上颜色相同的r个即可
                         f[i][j]=max(f[i][j],f[k-1][j-1]+i-k+1-sum);    //前k个数在不变色的时候再涂k~i,不同色时,总共有(i-k+1)个格子,r个不同色!!加上(i-k+1-r)即为同色!! 
                     // 总之 就是保留之前的那个最优状态,或是有更优状态更新!! 
                    }
                 crt[l][j]=max(crt[l][j],f[i][j]);//找出改行每算一段中最多正确的格子数 
                 }
         }
         //然后,显而易见的背包 
         for(k=1;k<=n;k++)
             for(i=t;i>=1;i--)
                 for(j=1;j<=min(c[k],i);j++) 
                 {
                     dp[i]=max(dp[i],dp[i-j]+crt[k][j]);
                 }
         printf("%d",dp[t]);
     return 0;
     }
    点击查看丑陋の代码&注释

     

     

  • 相关阅读:
    Linux下openSSL安装并颁发证书
    js控制自动上传文件
    Swoole 4.5v安装使用
    Flask-SQLAlchemy 的基本使用
    Flask入门之二
    微信消息订阅
    Flask入门之一
    MySQL主从库快速搭建
    FastAPI连接mysql傻瓜式
    UOJ Round总结
  • 原文地址:https://www.cnblogs.com/pile8852/p/9275450.html
Copyright © 2011-2022 走看看