洛谷P1388 算式
这题写得有点乱了
主要要注意 f[i][j][k] j-i < k 是不存在的 不能单纯的设为负值
因为两个负值相乘就变成正数了,所以不行
1 #include <cstdio> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 #define Dow(i,j,k) for(int i=j;i>=k;i--) 4 #define LL long long 5 using namespace std ; 6 7 const int N = 111,inf = 1e4 ; 8 int n,K ; 9 int a[N] ; 10 LL sum[N],f[N][N][N] ; 11 inline int max(int x,int y) { return x > y ? x : y ; } 12 inline int min(int x,int y) { return x < y ? x : y ; } 13 inline int read() 14 { 15 int x = 0 , f = 1 ; 16 char ch = getchar() ; 17 while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar(); } 18 while(ch>='0'&&ch<='9') { x = x * 10+ch-48 ; ch = getchar(); } 19 return x * f ; 20 } 21 22 int main() 23 { 24 n = read() ; K = read() ; 25 For(i,1,n) a[i]=read() , sum[i]=sum[i-1]+a[i] ; 26 For(i,1,n) 27 For(j,i,n) 28 For(k,0,n) 29 if(j-i<k) f[i][j][k] = -inf ; 30 For(i,1,n) 31 f[i][i][0] = a[i] ; 32 For(len,2,n) { 33 For(i,1,n-len+1) { 34 int j=i+len-1 ; 35 f[i][j][0]=sum[j]-sum[i-1] ; 36 For(k,1,min(K,j-i)) 37 For(p,i,j-1) 38 For(t,0,k) { 39 LL p1 = -inf ; 40 if(p-i>=t&&j-p-1>=k-t)LL p1 = f[i][p][t]+f[p+1][j][k-t] ; 41 LL p2 = -inf ; 42 if(t!=k&&p-i>=t&&j-p-1>=k-1-t) p2 = f[i][p][t]*f[p+1][j][k-1-t] ; 43 f[i][j][k]=max(f[i][j][k],max(p1,p2)) ; 44 } 45 } 46 } 47 printf("%lld ",f[1][n][K]) ; 48 return 0 ; 49 }