zoukankan      html  css  js  c++  java
  • [BZOJ] 1296 [SCOI2009]粉刷匠

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 2553  Solved: 1469
    [Submit][Status][Discuss]
    Description
    windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次,他最多能正确粉刷多少格子? 一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。
    
    Input
    输入文件paint.in第一行包含三个整数,N M T。 接下来有N行,每行一个长度为M的字符串,'0'表示红色,'1'表示蓝色。
    
    Output
    输出文件paint.out包含一个整数,最多能正确粉刷的格子数。
    
    Sample Input
    3 6 3
    
    111111
    
    000000
    
    001100
    
    Sample Output
    16
    
    HINT
    30%的数据,满足 1 <= N,M <= 100 <= T <= 100100%的数据,满足 1 <= N,M <= 500 <= T <= 2500 。
    
    Source

    学到了新姿势:dp套dp

    每输入一行,处理出f[i][j]表示前i个,刷了j次,正确的最大个数。
    为什么能这样写呢?题目说不能重复粉刷。

    现在有了f[m][k],表示这行刷k个能正确的个数,这就是一个分组背包了,n组,体积T,每组物品体积k,价值f[m][k]。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    const int MAXN=55;
    
    int n,m,t;
    
    char s[MAXN];
    
    int f[MAXN][MAXN],g[2][2505];
    int sum[MAXN];
    int main(){
        cin>>n>>m>>t;
        for(int i=1;i<=n;i++){
            memset(f,0,sizeof(f));
            memset(sum,0,sizeof(sum));
            scanf("%s",s+1);
            for(int j=1;j<=m;j++) sum[j]=sum[j-1]+(s[j]=='1');
            for(int j=1;j<=m;j++){
                for(int k=1;k<=m;k++){
                    for(int l=0;l<j;l++){
                        f[j][k]=max(f[j][k],f[l][k-1]+max(sum[j]-sum[l],j-l-sum[j]+sum[l]));
                    }
                }
            }
            for(int j=1;j<=t;j++){
                int top=min(j,m);
                for(int k=0;k<=top;k++){
                    g[i&1][j]=max(g[i&1][j],g[(i-1)&1][j-k]+f[m][k]);
                }
            }
        }
        int ans=-1;
        for(int i=0;i<=t;i++) ans=max(ans,g[n&1][i]);
        cout<<ans;
    }
    
    

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247393.html

  • 相关阅读:
    7、.net core 使用apollo
    6、初识Apollo
    5、supervisor安装使用
    Linux用户和用户组管理
    监督学习中的“生成模型”和“判别模型”
    Ubuntu 14.04 installation & bugs on Alienware-13
    Majority Element问题---Moore's voting算法
    redis之作为缓存的使用(二)
    redis之作为缓存的使用(五)缓存污染
    redis之作为缓存的使用(四)缓存击穿,雪崩,穿透
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247393.html
Copyright © 2011-2022 走看看