现在的位置: 首页 > 综合 > 正文

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

2018年04月24日 ⁄ 综合 ⁄ 共 1021字 ⁄ 字号 评论关闭
#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[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;
}

抱歉!评论已关闭.