Codevs1966 乘法遊戲 區間dp
阿新 • • 發佈:2018-12-23
跟石子歸併差不……多…?
好像所有的區間dp都差不多,然而我還是不會做。
狀態轉移方程:dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]+num[i]*num[j]*num[k]);
程式碼:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
#define MAXN (100+10)
int num[MAXN];
int dp[MAXN][MAXN];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++) scanf("%d", &num[i]);
memset(dp,63,sizeof(dp));
for(int i = 1; i <= n; i ++) dp[i][i] = dp[i][i+1] = 0;
for(int i = n; i >= 1; i --)
for(int j = i+1; j <= n; j ++)
for(int k = i; k <= j; k ++)
dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]+num[i]*num[j]*num[k]);
cout << dp[1][n];
return 0;
}