1. 程式人生 > >Codevs1966 乘法遊戲 區間dp

Codevs1966 乘法遊戲 區間dp

跟石子歸併差不……多…?
好像所有的區間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; }