1084: [SCOI2005]最大子矩阵 (动态规划)

来源:互联网 发布:seo 快速收录 编辑:程序博客网 时间:2024/05/29 17:46
#include<iostream>#include<cstdio>#define inf 0x7fffffffusing namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int n,m,K,s[101],s1[101],s2[101],g[101][11],f[101][101][11];inline void solve1(){for(int i=1;i<=n;i++) s[i]=s[i-1]+read();for(int i=1;i<=n;i++)for(int j=1;j<=K;j++){g[i][j]=g[i-1][j];for(int k=i-1;k>=0;k--)g[i][j]=max(g[i][j],g[k][j-1]+s[i]-s[k]);}printf("%d",g[n][K]);}inline void solve2(){for(int i=1;i<=n;i++)s1[i]=s1[i-1]+read(),s2[i]=s2[i-1]+read();for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=K;k++){f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k]);for(int x=i-1;x>=0;x--)f[i][j][k]=max(f[i][j][k],f[x][j][k-1]+s1[i]-s1[x]);for(int y=j-1;y>=0;y--)                 f[i][j][k]=max(f[i][j][k],f[i][y][k-1]+s2[j]-s2[y]);              if(i==j)for(int x=i-1;x>=0;x--)                 f[i][j][k]=max(f[i][j][k],f[x][x][k-1]+s1[i]-s1[x]+s2[j]-s2[x]);  }printf("%d",f[n][n][K]);}int main(){n=read();m=read();K=read();if(m==1)solve1();else solve2();return 0;}

0 0
原创粉丝点击