题目链接:点击打开链接
题目大意:一串数,相邻的3个数相乘,消去中间这个数,直至全部消失。求最大的结果,详见题目
题目分析:由于首尾不能取走,所以枚举中间的数,然后又分为了2段
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#define INF 0x3f3f3f3f
using namespace std;
int dp[105][105];
int main()
{
int n,i,num[105],len,j;
while(scanf("%d",&n)!=EOF)
{
memset(num,0,sizeof(num));
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
for(i=1;i<n-1;i++)
dp[i][i+2]=num[i]*num[i+1]*num[i+2];
for(len=4;len<=n;len++)
{
for(i=1;i<=n-len+1;i++)
{
dp[i][i+len-1]=INF;
for(j=i+1;j<i+len-1;j++)
dp[i][i+len-1]=min(dp[i][i+len-1],dp[i][j]+dp[j][i+len-1]+num[i]*num[j]*num[i+len-1]);
}
}
printf("%d\n",dp[1][n]);
}
return 0;
}