zoukankan      html  css  js  c++  java
  • [BZOJ 1296] 粉刷匠

    Link :

    BZOJ 1296 传送门

    Solution:

    还是自己DP做少了啊,这种**题一开始还做错了

    由于每一条木板间是独立的,且涉及到染色次数的分配

    要想到对木板间进行分组DP

    而要实现分组DP就要先求出每条木板上染色$x$次能贡献的最大答案

    这个用背包DP$O(n^3)$就行了

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int MAXN=55;
    char s[MAXN];
    int n,m,t,sum[MAXN],f[MAXN][2500+10],g[MAXN][MAXN],res=0;
    
    int main()
    {
        scanf("%d%d%d",&n,&m,&t);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s+1);memset(g,0,sizeof(g));
            for(int j=1;j<=m;j++) sum[j]=sum[j-1]+(s[j]=='1');
            for(int j=1;j<=m;j++) //背包DP
                for(int k=1;k<=m;k++)
                    for(int l=0;l<k;l++)
                        g[k][j]=max(g[k][j],g[l][j-1]+max(sum[k]-sum[l],k-l-(sum[k]-sum[l])));
            
            for(int j=1;j<=t;j++) //分组DP
                for(int k=1;k<=min(j,m);k++)
                    f[i][j]=max(f[i][j],f[i-1][j-k]+g[m][k]);
        }
        for(int i=1;i<=t;i++) res=max(res,f[n][i]);
        printf("%d",res);
        return 0;
    }

    Review:

    还是对各类DP模型不够敏感

    1、如果每组数之间相对独立且涉及到权重的分配,考虑使用分组DP(本质也是一种背包)

    2、一般能化简成求前$i$个里进行$j$次操作最值问题的,使用背包DP

  • 相关阅读:
    sabaki and leelazero
    apply current folder view to all folders
    string operation in powershell
    wirte function in powershell
    add environment path to powershell
    Module in powershell
    sql prompt
    vmware中鼠标在部分区域不能使用
    调整多个控件的dock的顺序
    行为型模型 策略模式
  • 原文地址:https://www.cnblogs.com/newera/p/9119368.html
Copyright © 2011-2022 走看看