zoukankan      html  css  js  c++  java
  • 粉刷匠(bzoj 1296)

    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 <= 10 ; 0 <= T <= 100 。 100%的数据,满足 1 <= N,M <= 50 ; 0 <= T <= 2500 。

    /*
        没想到scoi也有这么水的题。。。
        首先对于每个格子不管刷什么颜色,刷肯定比不刷更优,所以设
        dp[i][j][k][0/1]表示刷到i行j列用了k次并且这一格刷的是红/蓝的最大值。
        然后转移即可。 
    */
    #include<iostream>
    #include<cstdio>
    #define N 60
    #define M 2510
    using namespace std;
    int dp[N][N][M][2],n,m,T;
    char a[N][N];
    int main(){
        scanf("%d%d%d",&n,&m,&T);
        for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                for(int k=1;k<=T;k++){
                    if(j==1){
                        dp[i][j][k][0]=max(dp[i-1][m][k-1][0],dp[i-1][m][k-1][1])+(a[i][j]=='0');
                        dp[i][j][k][1]=max(dp[i-1][m][k-1][0],dp[i-1][m][k-1][1])+(a[i][j]=='1');
                    }
                    else {
                        dp[i][j][k][0]=max(dp[i][j-1][k][0],dp[i][j-1][k-1][1])+(a[i][j]=='0');
                        dp[i][j][k][1]=max(dp[i][j-1][k][1],dp[i][j-1][k-1][0])+(a[i][j]=='1');
                    }
                }
        int ans=0;
        for(int i=1;i<=T;i++)
            ans=max(ans,max(dp[n][m][i][0],dp[n][m][i][1]));
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    9.17(day11)
    9.14(day10)
    9.13(day9)
    9.12(day8)
    mysql 的存储过程
    MySQL 子查询与多表联合查询
    MySQL 函数
    MySQL 的查询
    MySQL的约束
    MySQL 表的增删改查操作
  • 原文地址:https://www.cnblogs.com/harden/p/6759462.html
Copyright © 2011-2022 走看看