题意
windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。
windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。
如果windy只能粉刷 T 次,他最多能正确粉刷多少格子?
分析
显然,木板之间是相互独立的。
我们可以定义表示第
行第
列一共刷了
次,并且刷的颜色是
表示红色,
表示蓝色。
然后我们可以利用空间优化掉第一维。
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define int long long
const int inf = 0x3f3f3f3f;
const int maxn = 60;
const int M = 1e9+7;
int n,m,t;
char s[maxn][maxn];
int dp[maxn][maxn*maxn][maxn]; //第j列,用了k次,刷的是**颜色
signed main()
{
cin>>n>>m>>t;
for(int i = 1; i <= n; i++)
{
cin>>(s[i]+1);
}
for(int i = 1; i <= n; i++) //枚举行
{
for(int j = 1; j <= m; j++) //枚举列
{
for(int k = 1; k <= t; k++) //枚举次数
{
for(int l = 0; l <= 1; l++) //枚举颜色
{
if(j == 1)
dp[j][k][l] = max(dp[m][k-1][0],dp[m][k-1][1])+(s[i][j]==l+'0');
else
dp[j][k][l] = max(dp[j-1][k][l],dp[j-1][k-1][l^1])+(s[i][j]==l+'0');
}
}
}
}
cout<<max(dp[m][t][0],dp[m][t][1])<<endl;
return 0;
} 
京公网安备 11010502036488号