首页 > 代码库 > poj 1651
poj 1651
给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积。直到只剩下首尾两个数为止。问最小得分是多少?
1 #include <iostream> 2 using namespace std; 3 #define max 105 4 int dp[max][max]; 5 int a[max]; 6 int min(int a,int b) 7 { 8 return a>b?b:a; 9 }10 int main()11 {12 int n;13 cin>>n;14 int i,j,k;15 for(i=0;i<n;i++)16 cin>>a[i];17 for(i=0;i<n-2;i++)18 dp[i][i+2]=a[i]*a[i+1]*a[i+2];19 int len;20 for(len=3;len<n;len++)21 for(i=0;i+len<n;i++)22 {23 j=i+len;24 for(k=i+1;k<j;k++)25 {26 if(dp[i][j]==0)27 dp[i][j]=dp[i][k]+dp[k][j]+a[i]*a[k]*a[j];28 else29 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[j]*a[k]);30 }31 }32 cout<<dp[0][n-1]<<endl;33 34 return 0;35 }
poj 1651
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。