标签:des style blog http color os strong io
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6188 | Accepted: 3777 |
Description
Input
Output
Sample Input
6 10 1 50 50 20 5
Sample Output
3650
题意:
从中间选择一个数乘以左右俩边的数,第一个和最后一个不能选择,这个数就拿出来,怎样拿出来的顺序,使总和最小。
分析:abc sum=a*b*c;
abcd sum1=abc+acd;
sum2=bcd+abd;
sum=min(sum1,sum2)
dp[i][j]=min(dp[i][j],a[i]*a[g]*a[j]+dp[i][g]+dp[g][j]);(i<g<j)
也就是说igj,向该数列插入数字,是i和g之间或者是g和i之间。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int dp[105][105]; int main() { int i,j,k,n,a[105],g; while(~scanf("%d",&n)) { memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) scanf("%d",&a[i]); for(k=2;k<n;k++)//保证最小有3位数。 { for(i=0;i<n-k;i++) { j=i+k; dp[i][j]=100000000;//求最小,初始化最大。 for(g=i+1;g<j;g++) dp[i][j]=min(dp[i][j],a[i]*a[g]*a[j]+dp[i][g]+dp[g][j]); } } printf("%d\n",dp[0][n-1]); } return 0; } /* 6 10 1 50 50 20 5 3650 */
poj 1651 http://poj.org/problem?id=1651,布布扣,bubuko.com
poj 1651 http://poj.org/problem?id=1651
标签:des style blog http color os strong io
原文地址:http://www.cnblogs.com/cancangood/p/3868800.html