• (DP) bzoj 1296


    1296: [SCOI2009]粉刷匠

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1042  Solved: 611
    [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 <= 10 ; 0 <= T <= 100 。
    100%的数据,满足 1 <= N,M <= 50 ; 0 <= T <= 2500 。

     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<string>
    #include<algorithm>
    using namespace std;
    #define MAXN 3000
    int f[MAXN][MAXN],sum[MAXN]; //f[i][j]=该行前i个格子刷j次最多的正确格子数,sum[i]=该行前i个格子是1的格子的数目
    int dp[MAXN][MAXN]; //dp[i][j]=前i行刷了j次的最多正确格子数
    char in[MAXN];
    int max(int a,int b)
    {
      if(a>b) return a;
      return b;
    }
    int min(int a,int b)
    {
      if(a<b) return a;
      return b;
    }
    int main()
    {
      int k,i,j,n,m,t,l,ans=-1;
      scanf("%d%d%d",&n,&m,&t);
      for(k=1;k<=n;k++)
      {
        scanf("%s",in+1);
        for(i=1;i<=m;i++)
          sum[i]=sum[i-1]+(in[i]=='1');
        for(i=1;i<=m;i++)
          for(j=1;j<=m;j++)
          {
            f[j][i]=0;
            for(l=0;l<j;l++)
            {
              int cnt=sum[j]-sum[l]; //区间[l,j]中是1的个数
              f[j][i]=max(f[j][i],f[l][i-1]+max(cnt,j-l-cnt)); //max(cnt,j-l-cnt):取刷0或刷1的正确格子数最大值
            }
          }
        for(i=1;i<=t;i++)
        {
          int cnt=min(m,i);//cnt=实际粉刷次数
          for(j=1;j<=cnt;j++)
            dp[k][i]=max(dp[k][i],dp[k-1][i-j]+f[m][j]); //背包
        }
      }
      for(i=1;i<=t;i++)
        ans=max(ans,dp[n][i]);
      printf("%d
    ",ans);
      return 0;
    }
  • 相关阅读:
    3.25Java常量
    3.26Java逻辑运算符
    3.26Java关系运算符
    Java标识符
    3.27Java位运算符
    3.26Java运算符(operator)
    3.26Java字符型(char)变量、常量
    3.26Java布尔类型(boolean)变量、常量
    《算法导论》第9章 顺序统计学 (1)最小值和最大值
    《算法导论》第8章 线性时间排序 (1)计数排序
  • 原文地址:https://www.cnblogs.com/water-full/p/4517300.html
Copyright © 2020-2023  润新知