题意
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; }