bzoj1296【SCOI2009】粉刷匠
2016-02-27 20:03
323 查看
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
3 6 3111111
000000
001100
Sample Output
16HINT
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 [i]); printf("%d\n",ans); return 0; }
相关文章推荐
- LeetCode题解:Same Tree
- 【NOI 2014】【BZOJ 3670】动物园 题解&代码(C++)
- C语言实现双向非循环链表
- Spring之自动装配注入
- 问卷调查
- Java程序工程规范
- NO2:自动生成sql语句
- HDU 1879 还是prim最小生成树、
- Redis主从复制
- 4G(LTE)背后的技术和利益纠结——VoIP,VoLTE,SIP,IMS的前世今生
- LeetCode题解:Move Zeroes
- Windows下安装MySQL卡在Starting Server..的解决办法
- 移动APP的开发技巧(上)
- 各种排序的排序思想和实现
- Exynos4412裸机开发 —— A/D转换器
- Spring容器中Bean的作用域
- jQuery源代码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码具体解释
- 算法代码实现之冒泡排序,Golang(Go语言)实现
- AAC音频格式详解
- Bean获取Spring容器