题意

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