您的位置:首页 > 其它

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

2014-07-16 22:48 225 查看
#include<iostream>
#include<cstdio>
#define inf 0x7fffffff
using 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
[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

[K]);
}
int main(){
n=read();m=read();K=read();
if(m==1)solve1();
else solve2();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: