[SCOI2009]粉刷匠
题目链接
dp[i][j][k][0/1]
前i条j段涂k次,最后一段涂红/蓝的最多正确格子数
红(0)蓝(1)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 52;
int f[N][N][N*N][2];
char g[N][N];
//dp[i][j][k][0/1]
//前i条j段涂k次,最后一段涂红/蓝的最多正确格子数
//红(0)蓝(1)
int main()
{
int n,m,K;
cin>>n>>m>>K;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>g[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=K;k++)
{
if(j==1)
{
f[i][j][k][0]=max(f[i-1][m][k-1][0],f[i-1][m][k-1][1])+(g[i][j]=='0');
f[i][j][k][1]=max(f[i-1][m][k-1][0],f[i-1][m][k-1][1])+(g[i][j]=='1');
}
else
{
f[i][j][k][0]=max(f[i][j-1][k][0],f[i][j-1][k-1][1])+(g[i][j]=='0');
f[i][j][k][1]=max(f[i][j-1][k][1],f[i][j-1][k-1][0])+(g[i][j]=='1');
}
}
cout<<max(f[n][m][K][0],f[n][m][K][1])<<endl;
}