zoukankan      html  css  js  c++  java
  • bzoj1084: [SCOI2005]最大子矩阵

    dp。状态转移方程在代码里

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn = 100 + 10;
    
    int a[maxn][3];
    int f[maxn][maxn][maxn];
    int s[maxn],s2[maxn][3];
    int n,m,k;
    
    int main() {
        scanf("%d%d%d",&n,&m,&k);
        if(m==1) {
            for(int i=1;i<=n;i++) { 
                scanf("%d",&a[i][0]);
                s[i]+=s[i-1]+a[i][0];
            }
            memset(f,0,sizeof(f));
            for(int p=1;p<=k;p++)
            for(int i=1;i<=n;i++) {
                f[p][i][0]=f[p][i-1][0];
                  for(int j=0;j<i;j++)
                f[p][i][0]=max(f[p][i][0],f[p-1][j][0]+s[i]-s[j]); 
            }
            printf("%d
    ",f[k][n][0]);
        }
        if(m==2) {
            for(int i=1;i<=n;i++) {
                scanf("%d%d",&a[i][1],&a[i][2]);
                s2[i][1]=s2[i-1][1]+a[i][1];
                s2[i][2]=s2[i-1][2]+a[i][2];
            }
            memset(f,0,sizeof(f));
            for(int p=1;p<=k;p++)
            for(int a=1;a<=n;a++) 
            for(int b=1;b<=n;b++) {
                f[p][a][b]=max(f[p][a-1][b],f[p][a][b-1]);        
                for(int c=0;c<a;c++)
                f[p][a][b]=max(f[p][a][b],f[p-1][c][b]+s2[a][1]-s2[c][1]);
                for(int c=0;c<b;c++)
                f[p][a][b]=max(f[p][a][b],f[p-1][a][c]+s2[b][2]-s2[c][2]);
                if(a==b) for(int c=0;c<a;c++)
                f[p][a][b]=max(f[p][a][b],f[p-1][c][c]+s2[a][1]+s2[a][2]-s2[c][1]-s2[c][2]);
            }
            printf("%d
    ",f[k][n][n]);
        }
         return 0;
    }
  • 相关阅读:
    [CF997E] Good SubSegment
    CF916E
    BZOJ2006 超级钢琴
    BZOJ4571
    凸包总结
    树形DP入门
    bzoj4300 绝世好题(位运算+DP)
    bzoj4552 [Tjoi2016&Heoi2016]排序 (线段树+二分)
    SP1716 GSS3
    Noip2009 Hankson 的趣味题 (简单数学)
  • 原文地址:https://www.cnblogs.com/invoid/p/5451207.html
Copyright © 2011-2022 走看看