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\n",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\n",f[k][n][n]); } return 0; }