Submit][Status][Discuss]Descript"/>

bzoj1296scoi2009粉刷匠

gavanwanggw gavanwanggw     2022-09-14     299

关键词:

1296: [SCOI2009]粉刷匠

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 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

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 。

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时刻 查看详情