洛谷P1388 算式

洛谷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\n",f[1][n][K]) ; 
48     return 0 ; 
49 }

 

posted @ 2017-10-03 23:35  third2333  阅读(281)  评论(0编辑  收藏  举报