POJ

来源:互联网 发布:linux运维笔记 编辑:程序博客网 时间:2024/05/21 11:21

题目链接:Multiplication Puzzle

定义状态dp[i][j]表示将区间[i, j]全部取完所需要的最小代价,答案就是dp[1][n - 2]。

状态转移方程为:dp[i][j] = min(dp[i][k - 1] + dp[k + 1][j] + a[i - 1] * a[k] * a[j + 1]) (i <= k <= j)

代码如下:

#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <map>using namespace std;const int INF = 0x3f3f3f3f;int main(){    int dp[105][105], a[105], n;    scanf("%d", &n);    for (int i = 0; i < n; i++)        scanf("%d", &a[i]);    memset(dp, 0, sizeof(dp));    for (int len = 0; len <= n - 3; len++)        for (int i = 1; i <= n - 2; i++)        {            int j = i + len;            if (j >= n - 1)                break;            if (!len)                dp[i][j] = a[i - 1] * a[i] * a[i + 1];            else            {                dp[i][j] = INF;                for (int k = i; k <= j; k++)                    dp[i][j] = min(dp[i][j], dp[i][k - 1] + dp[k + 1][j] + a[i - 1] * a[k] * a[j + 1]);            }        }    printf("%d\n", dp[1][n - 2]);    return 0;}



原创粉丝点击