HDU 4283(2012天津赛区网赛1006)

这一题用的是Dp,Dp[i][j][k]表示第i到j区间内已经上台k时所取得的最小值

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 
 7 #define INF 0x7fffffff
 8 #define MAXN 105
 9 
10 int dp[MAXN][MAXN][MAXN];
11 int a[MAXN];
12 int n;
13 
14 
15 int dfs(int s,int e,int k)
16 {
17     if(s==e) return a[s]*k;
18     if(s>e) return 0;
19     
20     if(dp[s][e][k]!=INF) return dp[s][e][k];
21     
22     int Min=dfs(s+1,e,k+1)+a[s]*k;
23     
24     for(int i=s+1;i<=e;i++)
25     {
26         int l=dfs(s+1,i,k);
27         int r=dfs(i+1,e,k+i+1-s);
28         
29         int x=a[s]*(k+i-s);
30         
31         x=l+r+x;
32         
33         if(Min>x) Min=x;    
34     }    
35     
36     
37     dp[s][e][k]=Min;
38     return Min;
39 }
40 int main()
41 {
42     int T;
43     int kk=0; 
44     scanf("%d",&T);
45     while(T--)
46     {
47         kk++; 
48         scanf("%d",&n);
49         
50         for(int i=1;i<=n;i++)
51         scanf("%d",&a[i]);
52         
53         for(int i=0;i<=n;i++)
54         for(int j=0;j<=n;j++)
55         for(int k=0;k<=n;k++)
56           dp[i][j][k]=INF;
57         
58         for(int i=0;i<=n;i++)
59         for(int k=0;k<=n;k++)
60            dp[i][i][k]=a[i]*k;
61            
62            dfs(1,n,0);
63            
64 printf("Case #%d: %d\n",kk,dp[1][n][0]);
65     }
66     system("pause");
67     return 0;    
68 }

 

posted on 2012-09-12 19:59  我的ACM之路  阅读(343)  评论(0编辑  收藏  举报

导航