• 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;
    }
  • 相关阅读:
    SQliteDatabase详解
    Eclipse常用快捷键
    Android 省市区三级联动
    关于安卓9patch图片的探究
    9patch
    Day3_UI布局--FXQ
    day2-UI布局
    Day01_扩展_Genymotion模拟器的使用
    React Examples
    React项目结构
  • 原文地址:https://www.cnblogs.com/invoid/p/5451198.html
Copyright © 2020-2023  润新知