bzoj 1084 //1084: [SCOI2005]最大子矩阵 动态规划

bzoj 1084   //1084: [SCOI2005]最大子矩阵   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1084

更多题解,详见https://blog.csdn.net/mrcrack/article/details/90228694BZOJ刷题记录

Accepted 1320 kb 116 ms C++/Edit 1261 B

//1084: [SCOI2005]最大子矩阵
//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1084
//
//因题中"分值",一直阻塞,要是改成"数值",就没什么问题了。
/*
样例解释如下
1
2

3 3
*/
//矩阵和,采用动归,能很快求出
//难在,如何挑选   子矩阵。2019-11-5
//此文https://www.cnblogs.com/shenben/p/5924518.html思路,代码都很棒。2019-11-5
/*

bzoj 1084 //1084: [SCOI2005]最大子矩阵 动态规划_第1张图片

bzoj 1084 //1084: [SCOI2005]最大子矩阵 动态规划_第2张图片

*/

//样例通过,提交Wrong_Answer    1512 kb    52 ms    C++/Edit    1260 B。2019-11-5
//排查,发现
//if(i==j)for(l=0;l //样例通过,提交AC.2019-11-5   动归似乎有点感觉。
#include
#include
#define maxn 103
#define maxk 11
int dp[maxn][maxn],f[maxn][maxn][maxk],s1[maxn],s2[maxn],N,M,K;
int max(int a,int b){
    return a>b?a:b;
}
int main(){
    int i,j,k,x,l,y;
    scanf("%d%d%d",&N,&M,&K);
    if(M==1){
        s1[0]=0,memset(dp,0,sizeof(dp));
        for(i=1;i<=N;i++)scanf("%d",&x),s1[i]=s1[i-1]+x;//s1[]前缀和
        for(k=1;k<=K;k++)
            for(i=1;i<=N;i++){
                dp[i][k]=dp[i-1][k];
                for(l=0;l             }
        printf("%d\n",dp[N][K]);
    }else if(M==2){
        s1[0]=s2[0]=0,memset(f,0,sizeof(f));
        for(i=1;i<=N;i++)scanf("%d%d",&x,&y),s1[i]=s1[i-1]+x,s2[i]=s2[i-1]+y;//读取技巧,值得一学
        for(k=1;k<=K;k++)
            for(i=1;i<=N;i++)
                for(j=1;j<=N;j++){
                    f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k]);
                    for(l=0;l                     for(l=0;l                     if(i==j)for(l=0;l                 }
        printf("%d\n",f[N][N][K]);
    }
    return 0;
}

你可能感兴趣的:(跟着大佬学算法)