bzoj 1296: [SCOI2009]粉刷匠 DP

                                                      bzoj 1296 粉刷匠

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1296

Description

windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次,他最多能正确粉刷多少格子? 一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。

Input

输入文件paint.in第一行包含三个整数,N M T。 接下来有N行,每行一个长度为M的字符串,'0'表示红色,'1'表示蓝色。

Output

输出文件paint.out包含一个整数,最多能正确粉刷的格子数。

Sample Input

3 6 3
111111
000000
001100

Sample Output

16

HINT

30%的数据,满足 1 <= N,M <= 10 ; 0 <= T <= 100 。
100%的数据,满足 1 <= N,M <= 50 ; 0 <= T <= 2500 。

这道题分部DP 最后再综合

#include
#include
#include
#include
#define MAXN 2505

using namespace std;

int f[MAXN][MAXN],sum[MAXN],dp[MAXN][MAXN];//dp[i][j]=前i行刷了j次的最多正确格子数
int n,m,t,ans;
inline int max(int x,int y)
{
    return (x>y) ? x: y;
}
inline int min(int x,int y)
{
    return (x>y) ? y :x;
}
char in[100];
int main()
{
    ans=-1;
    scanf("%d%d%d",&n,&m,&t);
    for(int p=1; p<=n; p++)
    {
        scanf("%s",in+1);
        for(int i=1; i<=m; i++)
        {
            sum[i]=sum[i-1]+(in[i]=='1');
        }
        for(int i=1; i<=m; i++)
            for(int j=1; j<=m; j++)
            {
                f[j][i]=0;
                for(int l=0; l



你可能感兴趣的:(bzoj)