首页 > 其他分享 >粉刷匠

粉刷匠

时间:2023-08-27 19:44:18浏览次数:21  
标签:le 格子 int 粉刷 ans define

粉刷匠

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

\(1\le n,m\le 50,0\le T\le 2500\)。

image-20230827193239047

两个部分,一个线性 DP,一个分组背包。

#include<cstdio>
#include<algorithm>
#include<functional>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while

const int N=60,M=2510;
int n,m,t,dp[N][N][N][2],f[N][M],a[N];
char s[N][N];
void init(int f[][N][2],char s[]){
    E(i, m)
        E(j, m){
            if(s[i]=='0')f[i][j][0]=max(f[i-1][j][0],f[i-1][j-1][1])+1,f[i][j][1]=f[i-1][j][1];
            else f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0])+1,f[i][j][0]=f[i-1][j][0];
        }
    // L(i, m+1)printf("%d ",max(f[m][i][0],f[m][i][1]));
    // puts("");
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    #endif
    scanf("%d%d%d",&n,&m,&t);
    E(i, n)scanf("%s",s[i]+1);
    if(t<=n){//贪心可以删去
        E(i, n){
            E(j, m)a[i]+=s[i][j]=='1';
            a[i]=max(a[i],m-a[i]);
        }
        sort(a+1,a+1+n,greater<int>());
        int ans=0;
        E(i, t)ans+=a[i];
        printf("%d",ans);
        return 0;
    }
    E(i, n)init(dp[i],s[i]);
    E(i, n)
        L(j, t+1){
            f[i][j]=f[i-1][j];
            L(k, m+1)
                if(j>=k)
                    f[i][j]=max(f[i][j],f[i-1][j-k]+max(dp[i][m][k][0],dp[i][m][k][1]));
        }
    printf("%d",f[n][t]);
    return 0;
}

标签:le,格子,int,粉刷,ans,define
From: https://www.cnblogs.com/wscqwq/p/17660712.html

相关文章

  • 【DP】LeetCode 256. 粉刷房子
    题目链接256.粉刷房子假如有一排房子,共n个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜......
  • P4158 [SCOI2009]粉刷匠
    题意:windy有N条木板需要被粉刷。每条木板被分为M个格子。每个格子要被刷成红色或蓝色。windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。每个格......
  • 做题记录整理dp11 P4158 [SCOI2009]粉刷匠(2022/9/23)
    P4158[SCOI2009]粉刷匠事实上前半个小时我甚至没想用dp做。。。感觉这道题难度标高了(跟那个想让我测出题人的码的题相比)首先可以发现每一行之间都是独立的,所以先考虑把......
  • 【线性dp】 [SCOI2009]粉刷匠
    点个关注点个赞吧一道比较简单的线性dp题目前置知识:会手推一些简单的状态转移方程、较为熟练地掌握背包问题模型[SCOI2009]粉刷匠题目描述windy有\(N\)条木......
  • 矩形粉刷(期望)
    题面题目描述为了庆祝新的一年到来,小M决定要粉刷一个大木板。大木板实际上是一个W*H的方阵。小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两......