首页 > 代码库 > wikioi 1048 石子归并
wikioi 1048 石子归并
dp[i][j]=min(dp[i][j],dp[i][k],dp[k+1][j]+sum[i][j]);
表示i-j的最小合并代价。
1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 5 using namespace std; 6 const int INF = 1 << 30; 7 const int N = 205; 8 9 int dp[N][N]; 10 int sum[N]; 11 int a[N]; 12 13 int getMinval(int a[],int n) 14 { 15 for(int i=0;i<n;i++) 16 dp[i][i] = 0; 17 for(int v=1;v<n;v++) 18 { 19 for(int i=0;i<n-v;i++) 20 { 21 int j = i + v; 22 dp[i][j] = INF; 23 int tmp = sum[j] - (i > 0 ? sum[i-1]:0); 24 for(int k=i;k<j;k++) 25 dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j] + tmp); 26 } 27 } 28 return dp[0][n-1]; 29 } 30 31 int main() 32 { 33 int n; 34 while(scanf("%d",&n)!=EOF) 35 { 36 for(int i=0;i<n;i++) 37 scanf("%d",&a[i]); 38 sum[0] = a[0]; 39 for(int i=1;i<n;i++) 40 sum[i] = sum[i-1] + a[i]; 41 printf("%d\n",getMinval(a,n)); 42 } 43 return 0; 44 }
wikioi 1048 石子归并
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。