石子合并

这个要用动态规划写...

然后合并果子又要用贪心...

石子和果子...

大概编题目的老师也有苦衷的吧...

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int MAXN = 1e6 + 5 ;
 5 
 6 int n , N , min_ans = MAXN , max_ans;
 7 int a[401] ;
 8 int f_max[401][401] , f_min[401][401];
 9 
10 int read(){
11     char c ;
12     int sign = 1 ;
13     while((c = getchar()) < '0' || c > '9') 
14         if(c == '-') sign = -1 ;
15     int Ans = c - '0' ;
16     while((c = getchar()) >= '0' && c <= '9')
17         Ans = Ans * 10 + c - '0' ;
18     return Ans * sign ;
19 }
20 
21 int main(){
22     n = read() ;
23     N = (n << 1) ;
24     for(int i = 1 ; i <= n ; ++ i){
25         a[i] = a[i + n] = read() ;
26     }
27     for(int i = 2 ; i <= N ; ++ i){
28         a[i] += a[i - 1] ;
29     }
30     for(int i = 2 ; i <= n ; ++ i){
31         for(int j = 1 ; j + i - 1 <= N ; ++ j){
32             int end = j + i - 1 ;
33             f_min[j][end] = MAXN , f_max[j][end] = 0 ;
34             for(int k = j ; k <= end - 1 ; ++ k){
35                 f_min[j][end] = min(f_min[j][end] , f_min[j][k] + f_min[k + 1][end] + a[end] - a[j - 1]) ;
36                 f_max[j][end] = max(f_max[j][end] , f_max[j][k] + f_max[k + 1][end] + a[end] - a[j - 1]) ;
37             }
38         }
39     }
40     for(int i = 1 ; i <= n ; ++ i){
41         min_ans = min(min_ans , f_min[i][i + n - 1]) ;
42         max_ans = max(max_ans , f_max[i][i + n - 1]) ;
43     }
44     cout << min_ans << endl << max_ans ;
45     return 0 ;
46 }

 

posted @ 2018-08-17 15:59  GCCCC  阅读(162)  评论(0)    收藏  举报