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 }