题目大意
windywindywindy有 NNN 条木板需要被粉刷。
每条木板被分为MMM 个格子。
每个格子要被刷成红色或蓝色。
windywindywindy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。
每个格子最多只能被粉刷一次。
如果windywindywindy只能粉刷TTT 次,他最多能正确粉刷多少格子?
一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。
题目解析
DPDPDP
设f[i,j,k,0/1]f[i,j,k,0/1]f[i,j,k,0/1]表示前iii个木板,涂色到第iii个木板的第jjj个,粉刷了kkk次,且第i,ji,ji,j个的格子涂成0/10/10/1的最大值。
当j=1j=1j=1时,f[i,j,k,0]=max(f[i−1,m,k−1,0],f[i−1,m,k−1,1])f[i,j,k,0]=max(f[i-1,m,k-1,0],f[i-1,m,k-1,1])f[i,j,k,0]=max(f[i−1,m,k−1,0],f[i−1,m,k−1,1]),f[i,j,k,1]f[i,j,k,1]f[i,j,k,1]同理。表示到新的一个木板时,就另外涂色。
当j>1j>1j>1时,f[i,j,k,0]=max(f[i,j−1,k,0],f[i,j−1,k−1,1])f[i,j,k,0]=max(f[i,j-1,k,0],f[i,j-1,k-1,1])f[i,j,k,0]=max(f[i,j−1,k,0],f[i,j−1,k−1,1]),f[i,j,k,1]f[i,j,k,1]f[i,j,k,1],同理。
接着判断当前格子的颜色,若为000,则f[i,j,k,0]++f[i,j,k,0]++f[i,j,k,0]++,反之同理。
代码
#include<bits/stdc++.h>
using namespace std;
int f[51][51][2501][2];
int n,m,t;
string s;
int main()
{
cin>>n>>m>>t;
for(int i=1;i<=n;i++)
{
cin>>s;
for(int j=1;j<=m;j++)
for(int k=1;k<=t;k++)
{
if(j!=1)
f[i][j][k][0]=max(f[i][j-1][k][0],f[i][j-1][k-1][1]),f[i][j][k][1]=max(f[i][j-1][k][1],f[i][j-1][k-1][0]);
else
f[i][j][k][1]=f[i][j][k][0]=max(f[i-1][m][k-1][0],f[i-1][m][k-1][1]);
if(s[j-1]=='0') f[i][j][k][0]++;else f[i][j][k][1]++;
}
}
cout<<max(f[n][m][t][1],f[n][m][t][0]);
}