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 。
大佬已经A了102道题啦。我也A了27道题啦(真是够了)。祝贺祝贺!!
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int N, M, T, ans, a[52][52], dp[52][52][2505][2];
int main() {
scanf("%d %d %d", &N, &M, &T);
for(int i = 1; i <= N; i ++)
for(int j = 1; j <= M; j ++)
scanf("%1d", &a[i][j]);
for(int i = 1; i <= N; i ++)
for(int j = 1; j <= M; j ++)
for(int k = 1; k <= T; k ++)
if(j == 1) {
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]);
if(! a[i][j]) dp[i][j][k][0] ++; else dp[i][j][k][1] ++;
}
else {
dp[i][j][k][0] = max(dp[i][j - 1][k - 1][1], dp[i][j - 1][k][0]);
dp[i][j][k][1] = max(dp[i][j - 1][k - 1][0], dp[i][j - 1][k][1]);
if(! a[i][j]) dp[i][j][k][0] ++; else dp[i][j][k][1] ++;
}
for(int i = 1; i <= T; i ++)
ans = max(ans, dp[N][M][i][0]), ans = max(ans, dp[N][M][i][1]);
printf("%d", ans);
return 0;
}