-
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; }
E - Multiplication Puzzle -区间DP
最新推荐文章于 2020-10-22 16:26:20 发布