乘法遊戲(tyvj P1014)區間dp
阿新 • • 發佈:2018-12-23
區間dp,dp[i][j] = min ( 左右兩邊去掉的數計算的和 + 當前數a[k]*a[i]*a[j] )
#include<stdio.h> #include<iostream> #include<string.h> #include<vector> #include<map> #include<algorithm> #define lson l,m,level*2 #define rson m+1,r,level*2+1 using namespace std; int a[110]; int dp[110][110]; int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } memset(dp,0,sizeof(dp)); for(int l=3;l<=n;l++){ for(int i=0;i<n;i++){ int j = i+l-1; dp[i][j] = 0x3f3f3f3f; for(int k=i+1;k<j;k++){ dp[i][j] = min(dp[i][j],dp[i][k] + dp[k][j] + a[i]*a[j]*a[k]); } } } printf("%d\n",dp[0][n-1]); return 0; }