关键词:
1296: [SCOI2009]粉刷匠
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1479 Solved: 837
[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
111111
000000
001100
Sample Output
HINT
30%的数据。满足 1 <= N,M <= 10 ; 0 <= T <= 100 。 100%的数据,满足 1 <= N,M <= 50 ; 0 <= T <= 2500 。
Source
这道题做法是两次DP。
能够发现不同的木板是相互独立,互相无影响的。
所以我们能够O(n^3)暴力DP计算出每一条木板,粉刷j次最多能正确粉刷的数量。
然后对于不同的木板再用一次DP计算答案。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #define F(i,j,n) for(int i=j;i<=n;i++) #define D(i,j,n) for(int i=j;i>=n;i--) #define ll long long using namespace std; int n,m,t,ans=0; int sum[55],f[55][55],g[55][2505]; char s[55]; inline int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int main() { n=read();m=read();t=read(); F(i,1,n) { scanf("%s",s+1); F(j,1,m) sum[j]=sum[j-1]+(s[j]=='1'); F(k,1,m) F(j,1,m) { f[j][k]=0; F(l,0,j-1) { int tmp=sum[j]-sum[l]; f[j][k]=max(f[j][k],f[l][k-1]+max(tmp,j-l-tmp)); } } F(j,1,t) F(k,1,min(j,m)) g[i][j]=max(g[i][j],g[i-1][j-k]+f[m][k]); } F(i,1,t) ans=max(ans,g[n][i]); printf("%d ",ans); return 0; }
bzoj1296:[scoi2009]粉刷匠
BZOJ1296:[SCOI2009]粉刷匠 Descriptionwindy 查看详情
[bzoj1296][scoi2009]粉刷匠[dp+分组背包]
1296:[SCOI2009]粉刷匠TimeLimit: 10Sec MemoryLimit: 162MBSubmit 查看详情
bzoj1296:[scoi2009]粉刷匠
Descriptionwindy有N条木板需要被粉刷。每条木板被分为M个格子。每个格子要被刷成红色或蓝色。windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。每个格子最多只能被粉刷一次。如果windy只能粉刷T次,他最... 查看详情
bzoj1296:[scoi2009]粉刷匠(dp)
1296:[SCOI2009]粉刷匠题目:传送门题解: DP新姿势:dp套dp 我们先单独处理每个串,然后再放到全局更新: f[i][k]表示当前串枚举到第i个位置,用了k次机会 F[i][j]则表示总答案代码:1#include<cstdio>2#include<cstring&... 查看详情
bzoj1296(scoi2009)粉刷匠(代码片段)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1296这道题暴露出自己: 1.对于区间与前缀的可转化性认识不足; 2.对于分组背包不够熟练。很容易想到最后是一个分组背包,枚举总共刷k次,前几个木条刷了k-j次,当前木条... 查看详情
bzoj1296--粉刷匠(dp)
1296:[SCOI2009]粉刷匠TimeLimit: 10Sec MemoryLimit: 162MBSubmit: 2324 Solved: 1340[Submit][Status][Discuss]Descriptionwindy有N条木板需要被粉刷。每条木板被分为M个格子。每个格子要被刷成红色或蓝色。wi 查看详情
1296:[scoi2009]粉刷匠[多重dp]
1296:[SCOI2009]粉刷匠TimeLimit: 10Sec MemoryLimit: 162MBSubmit: 1919 Solved: 1099[Submit][Status][Discuss]Descriptionwindy有N条木板需要被粉刷。每条木板被分为M个格子。每个格子要被刷成红色或蓝色。wi 查看详情
1296:[scoi2009]粉刷匠(代码片段)
TimeLimit: 10Sec MemoryLimit: 162MBSubmit: 2752 Solved: 1591[Submit][Status][Discuss]Descriptionwindy有N条木板需要被粉刷。每条木板被分为M个格子。每个格子要被刷成红色或蓝色。windy每次粉刷,只能选择一条木板上一 查看详情
粉刷匠(bzoj1296)
Descriptionwindy有N条木板需要被粉刷。每条木板被分为M个格子。每个格子要被刷成红色或蓝色。windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。每个格子最多只能被粉刷一次。如果windy只能粉刷T次,他最... 查看详情
codevs1744格子染色==bzoj1296粉刷匠
...运行结果 题目描述 Description有n条木板需要被粉刷。每条木板被分为m个格子。每个格子要被刷成红色或蓝色。输入描述 InputDescriptionDizzy每次粉刷,只能选择一条木板上一段连续的 查看详情
scoi2009粉刷匠
Description windy有N条木板需要被粉刷。每条木板被分为M个格子。每个格子要被刷成红色或蓝色。windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。每个格子最多只能被粉刷一次。如果windy只能粉刷T... 查看详情
[scoi2009]粉刷匠(分组背包)(代码片段)
Problemwindy有N条木板需要被粉刷。每条木板被分为M个格子。每个格子要被刷成红色或蓝色。windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。每个格子最多只能被粉刷一次。如果windy只能粉刷T次,他最多... 查看详情
p4158[scoi2009]粉刷匠(dp)(代码片段)
P4158[SCOI2009]粉刷匠(dp)考虑每行独立计算。所以可以开一个三维数组:g[i][j][k]g[i][j][k]g[i][j][k]第iii行前jjj列涂了kkk次的最大值。然后再开一个二维数组f[i][j]f[i][j]f[i][j]表示前iii行涂了jjj次的最大值。预处理二维前缀和。然后ggg... 查看详情
p4158[scoi2009]粉刷匠(代码片段)
题目链接我们不妨先考虑只有一行的情形。我们做两个前缀和(red_i,bule_i)分别表示前(i)个里有多少个红色块和蓝色块。设(f[i][k])为做到第(i)块,此时用了(k)次涂刷的最大收益。我们思考如下问题:既然重复涂色没有收益,那么我... 查看详情
题解p4158[scoi2009]粉刷匠(代码片段)
状态:dp[i][j][k][0/1]:到达第i行时,到达第j列时,刷到第k次时,这一格有没有刷对转移换一块木板时肯定要多刷一次dp[i][j][k][0]=max(dp[i-1][m][k-1][0],dp[i-1][m][k-1][1]);dp[i][j][k][1]=max(dp[i-1][m][k-1][0],dp[i-1][m][k-1][1])+1;当前格子与上一个格子颜色... 查看详情
[scoi2009]粉刷匠(动态规划,序列dp,背包)(代码片段)
分别对每块木板做区间dp,设(g[i][j])表示前i个格子,刷恰好j次,并且第i格是合法的最多合法的格子数.从前往后枚举断点来转移就好了.这样处理再出来(g[i][j])每一块木板i刷j次的最大合法格子数.最后再合并每块木板的答案,用(dp[i][j])... 查看详情
清北前紧急补课12粉刷匠(代码片段)
我是一个粉刷匠粉刷本领强~~要想看真正的粉刷匠请进入这小哥哥的blog嘻嘻嘻题目描述windy有N条木板需要被粉刷。每条木板被分为M个格子。每个格子要被刷成红色或蓝色。windy每次粉刷,只能选择一条木板上一段连续的格子,然... 查看详情
[bzoj1297][scoi2009]迷路
1297:[SCOI2009]迷路TimeLimit: 10Sec MemoryLimit: 162MBSubmit: 1418 Solved: 1017[Submit][Status][Discuss]Descriptionwindy在有向图中迷路了。该有向图有N个节点,windy从节点0出发,他必须恰好在T时刻 查看详情