标签:
输入有多组测试数据。
每组第一行为n(n<=100),表示有n堆石子,。
二行为n个用空格隔开的整数,依次表示这n堆石子的石子数量ai(0<ai<=100)
3
1 2 3
9 11
解题:典型的区间型dp
1 #include <iostream> 2 #include <cstdio> 3 #define INF 0x3f3f3f3f 4 using namespace std; 5 const int maxn = 300; 6 int maxS[maxn][maxn],minS[maxn][maxn],sum[maxn]; 7 int main(){ 8 int n; 9 while(~scanf("%d",&n)){ 10 for(int i = 1; i <= n; ++i){ 11 scanf("%d",sum+i); 12 maxS[i][i] = minS[i][i] = 0; 13 sum[i] += sum[i-1]; 14 } 15 for(int j = 2; j <= n; ++j){ 16 for(int i = 1; i+j-1 <= n; ++i){ 17 int t = i+j-1,tmp = sum[t] - sum[i-1]; 18 maxS[i][t] = -INF; 19 minS[i][t] = INF; 20 for(int k = i; k < t; ++k){ 21 minS[i][t] = min(minS[i][t],minS[i][k]+minS[k+1][t]+tmp); 22 maxS[i][t] = max(maxS[i][t],maxS[i][k]+maxS[k+1][t]+tmp); 23 } 24 } 25 } 26 printf("%d %d\n",minS[1][n],maxS[1][n]); 27 } 28 return 0; 29 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4325375.html