标签:des c style class blog code
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 96 | Accepted: 48 |
Description
Input
Output
Sample Input
Sample Outpu
11
分析:设sum[i]为前i个石子的总分,dp[i][j]为i到j之间最小得分。
则可得状态转移方程dp[i][j]=min{dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]};
枚举对调位置,找出最小得分。
代码:
1 #include <stdio.h> 2 #include <algorithm> 3 4 using namespace std; 5 #define MAX 0x7fffffff/2 6 int dp[110][110], n, a[110], w[110], ans; 7 8 int dpp() 9 { 10 int i, j, l, k; 11 w[0]=0; 12 13 for(i=0;i<101;i++) 14 for(j=0;j<101;j++) 15 dp[i][j]=MAX; 16 for(i=1;i<=n;i++){ 17 w[i]=w[i-1]+a[i]; 18 dp[i][i]=0; 19 } 20 for(i=n-1;i>=1;i--) 21 { 22 for(l=1;l<=n-i;l++) 23 { 24 j=l+i; 25 for(k=i;k<j;k++) 26 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+w[j]-w[i-1]); 27 } 28 } 29 if(ans>dp[1][n]) 30 ans=dp[1][n]; 31 return ans; 32 } 33 34 main() 35 { 36 int i, j; 37 scanf("%d",&n); 38 for(i=1;i<=n;i++) scanf("%d",&a[i]); 39 ans=MAX; 40 dpp(); 41 for(i=1;i<n;i++) 42 { 43 swap(a[i],a[i+1]); 44 dpp(); 45 swap(a[i],a[i+1]); 46 } 47 printf("%d\n",ans); 48 }
标签:des c style class blog code
原文地址:http://www.cnblogs.com/qq1012662902/p/3759885.html