• 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;
    }
  • 相关阅读:
    C# 对XML操作-实例
    XML
    得到一个随机数组的方法
    Node Redis 小试
    Hexo快速搭建静态博客并实现远程VPS自动部署
    substr.js 字符串切割
    GraphicsMagick 学习笔记
    store.js 跨浏览器的localStorage
    bodyParser中间件的研究
    Sublime Text 使用指南
  • 原文地址:https://www.cnblogs.com/invoid/p/5451207.html
Copyright © 2020-2023  润新知