题目大意
有 条木板需要被粉刷。
每条木板被分为 个格子。
每个格子要被刷成红色或蓝色。
每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。
每个格子最多只能被粉刷一次。
如果只能粉刷 次,他最多能正确粉刷多少格子?
一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。
题目解析
设表示前个木板,涂色到第个木板的第个,粉刷了次,且第个的格子涂成的最大值。
当时,,同理。表示到新的一个木板时,就另外涂色。
当时,,,同理。
接着判断当前格子的颜色,若为,则,反之同理。
代码
#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]);
}
来源:https://blog.csdn.net/weixin_43909855/article/details/98991368