E - Multiplication Puzzle
POJ - 1651 题意:不断取数最后留下第一个跟第n个取数话费为这个数a[i]*a[i-1]*a[i+1]求怎么取最小话费。思路:区间dp从小区更新到大区间维护最小值。老套路① 区间长度②枚举起点③枚举中间点 #include<iostream>
#include<cstring>
using namespace std;
#define maxn 111
#define ll long long
#define inf 0x3f3f3f3f
int n,a[maxn];
int dp[maxn][maxn];
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
for(int len=2; len<n; len++)
for(int i=1; i+len<=n; i++)
{
int j=i+len;
dp[i][j]=inf;
for(int k=i+1; k<j; k++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[k]*a[i]*a[j]);
}
cout<<dp[1][n]<<endl;
return 0;
}