题目:洛谷4158

分析:

这题一看就是动态规划。

可以看出,如果每个木条粉刷的次数是固定的,那么这些木条是互不干扰的,因此对于每个木条可以通过dp来求出把T次中的j次分配给这个木条时可以获得的最大正确数,然后再dp出如何分配这T个粉刷次数可以获得最优解(类似于背包)。

针对这个思路设计两个状态:

\(dp1[i][j]\)表示一个木条的前\(i\)个格子被粉刷j次时最大正确数

\(dp2[i][j]\)表示前i个木条粉刷\(j\)次时最大正确数

\(dp1\)能够这样设计的理由是:刷前\(a\)个格子显然不比只刷前\(a\)个格子中的一段差(因为后一种情况下没刷的格子一定是错误的)

于是能想cai到dp方程:

$$dp1[i][j]=max(dp1[i][j],dp1[k-1][j-1]+max(k-i中 0 的数量 , k-i中 1 的数量) )$$

(对这个木条的第$j$次粉刷是从$k$刷到$i$)
($k$~$j$中0、1的数量可以用前缀和来快速求出)

$$dp2[i][j]=max(dp2[i][j],dp2[i-1][j-k]+dp1[m][k])$$

(这个类似背包,不解释)

代码:

#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int n,m,t,sum[60],dp1[60][2500],dp2[60][2500];
//sum[i]表示前i个格子中1的数量
//dp1[i][j]表示一个木条的前i个格子被粉刷j次时最大正确数
//dp2[i][j]表示前i个木条粉刷j次时最大正确数
char in[60];
int main(void)
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
{
scanf("%s",in+1);
for(int i=1;i<=m;i++)
sum[i]=sum[i-1]+in[i]-'0';
memset(dp1,0,sizeof(dp1));
for(int i=1;i<=m;i++)
//一个木条被刷的次数不可能大于它的长度
for(int j=1;j<=m;j++)
for(int k=1;k<=j;k++)
//k表示第i次从第k个格子刷到第j个格子
dp1[j][i]=max(dp1[j][i],
dp1[k-1][i-1]+max(sum[j]-sum[k-1],j-k+1-(sum[j]-sum[k-1])));
//j-k+1-(sum[j]-sum[k-1]即从k到j中0的数量
for(int j=1;j<=t;j++)
{
for(int k=1;k<=min(j,m);k++)
dp2[i][j]=max(dp2[i][j],dp2[i-1][j-k]+dp1[m][k]);
}
}
printf("%d",dp2[n][t]);
return 0;
}

【洛谷4158/BZOJ1296】[SCOI2009]粉刷匠(动态规划)的更多相关文章

  1. 背包 DP【洛谷P4158】 [SCOI2009]粉刷匠

    P4158 [SCOI2009]粉刷匠 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上 ...

  2. BZOJ1296 [SCOI2009]粉刷匠 动态规划 分组背包

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1296 题意概括 有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝 ...

  3. [Bzoj1296][Scoi2009] 粉刷匠 [DP + 分组背包]

    1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2184  Solved: 1259[Submit][Statu ...

  4. bzoj1296: [SCOI2009]粉刷匠(DP)

    1296: [SCOI2009]粉刷匠 题目:传送门 题解: DP新姿势:dp套dp 我们先单独处理每个串,然后再放到全局更新: f[i][k]表示当前串枚举到第i个位置,用了k次机会 F[i][j] ...

  5. bzoj 1296: [SCOI2009]粉刷匠 动态规划

    Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...

  6. 【Dp】Bzoj1296 [SCOI2009] 粉刷匠

    Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...

  7. BZOJ1296: [SCOI2009]粉刷匠 DP

    Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...

  8. 2018.09.02 bzoj1296: [SCOI2009]粉刷匠(dp套dp)

    传送门 dp好题. 先推出对于每一行花费k次能最多粉刷的格子数. 然后再推前i行花费k次能最多粉刷的格子数. 代码: #include<bits/stdc++.h> #define N 5 ...

  9. BZOJ1296 [SCOI2009]粉刷匠 【dp】

    题目 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被粉刷 ...

随机推荐

  1. python黑科技库:FuckIt.py,让你代码从此远离bug

    今天给你推荐的这个库叫 “FuckIt.py”,名字一看就是很黄很暴力的那种,作者是这样介绍它的: FuckIt.py uses state-of-the-art technology to make ...

  2. 洛谷 1012 拼数(NOIp1998提高组)

    [题解] 我们要做的就是把这些数排序.排序的时候判断两个数是否交换的方法,就是把这两个数相接形成两个长度相同的数字,比较这两个数字的大小. #include<cstdio> #includ ...

  3. Discuz 部署,500 – 内部服务器错误。 您查找的资源存在问题,因而无法显示。

    Windows7 IIS 500 – 内部服务器错误解决方案 1.解决方法:打开IIS,在功能视图中找到“错误页”,双击进去后,看最右边的“操作”下的“编辑功能设置…”,将“错误响应”下的“详细错误” ...

  4. noip模拟赛 轰炸

    题目描述 C国和W国爆发了战争!YJC决定对W国的n个城市进行轰炸.每个城市都有一个重要度ai.设xi=‘重要度大于ai的城市数+1’,那么编号为i城市就是第xi个被轰炸的城市.显然这样能保证重要度大 ...

  5. UVA_1575

    https://vjudge.net/problem/UVA-1575 枚举答案(k)..对k质因数分解,质数的指数为cnt[i],若n==A(tot_cnt,tot_cnt) / A(cnt[i]& ...

  6. 27、Java并发性和多线程-CAS(比较和替换)

    以下内容转自http://ifeve.com/compare-and-swap/: CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期 ...

  7. DELPHI新版本WEBSERVICE的变化

    DELPHI新版本WEBSERVICE,不仅可以编译成ISAPI DLL,依靠IIS部署, 并且还可以编译成单独的EXE,不再依赖IIS就可以独立运行,这一点未尝不可以说是非常方便的改进.

  8. PHP array_pad()

    定义和用法 array_pad() 函数向一个数组插入带有指定值的指定数量的元素. 语法 array_pad(array,size,value) 参数 描述 array 必需.规定数组. size 必 ...

  9. How can I add files to a Jar file? (or add a file to a zip archive)

    https://stackoverflow.com/questions/12239764/how-can-i-add-files-to-a-jar-file M.java class M{ publi ...

  10. 去除ckeditor上传图片预览中的英文字母

    去除ckeditor上传图片预览中的英文字母 CKEDITOR.replace('text', { filebrowserImageUploadUrl : 'upload_img.do', langu ...