传送门:牛客
题目描述:
windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。
windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。
如果windy只能粉刷 T 次,他最多能正确粉刷多少格子?
一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。
输入:
3 6 3
111111
000000
001100
输出:
16
主要思路:
下面是具体的代码部分:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
ll x=0,w=1;char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
#define maxn 1000000
#define ll_maxn 0x3f3f3f3f3f3f3f3f
const double eps=1e-8;
int n,m,t;
int huafei[60][60][60];
int f[maxn];int sum[100][100];
int main() {
n=read();m=read();t=read();
string num;
for(int i=1;i<=n;i++) {
cin>>num;
for(int j=0;j<num.length();j++) {
sum[i][j+1]=sum[i][j]+num[j]-'0';
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
huafei[i][j][1]=max(sum[i][j],j-sum[i][j]);
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
for(int k=2;k<=j;k++) {
for(int x=k-1;x<j;x++) {
int leijia=max(sum[i][j]-sum[i][x],j-x-(sum[i][j]-sum[i][x]));
huafei[i][j][k]=max(huafei[i][j][k],huafei[i][x][k-1]+leijia);
}
}
}
}
for(int i=1;i<=n;i++) {
for(int j=t;j>=0;j--) {
for(int num=1;num<=m;num++) {
if(j<num) break;
f[j]=max(f[j],f[j-num]+huafei[i][m][num]);
}
}
}
cout<<f[t]<<endl;
return 0;
}