zoukankan      html  css  js  c++  java
  • ZOJ 1602 Multiplication Puzzle(区间DP)题解

    题意:n个数字的串,每取出一个数字的代价为该数字和左右的乘积(1、n不能取),问最小代价

    思路:dp[i][j]表示把i~j取到只剩 i、j 的最小代价。

    代码:

    #include<set>
    #include<map>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    typedef long long ll;
    using namespace std;
    const int maxn = 100 + 10;
    const int MOD = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    int dp[maxn][maxn], a[maxn];
    int main(){
        int n;
        while(~scanf("%d", &n)){
            for(int i = 1; i <= n; i++){
                scanf("%d", &a[i]);
            }
            memset(dp, INF, sizeof(dp));
            for(int i = 1; i + 1 <= n; i++){
                dp[i][i + 1] = 0;
            }
            for(int len = 3; len <= n; len++){
                for(int i = 1; i + len - 1 <= n; i++){
                    int j = i + len - 1;
                    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
    ", dp[1][n]);
        }
        return 0;
    }

    Multiplication Puzzle

     ZOJ - 1602

  • 相关阅读:
    前端基础知识1
    mysql作业
    mysql了解知识点
    mysql3
    数据库作业2
    循环结构经典题型
    计算1
    猜数字游戏
    css的显示
    定位和position定位
  • 原文地址:https://www.cnblogs.com/KirinSB/p/10320838.html
Copyright © 2011-2022 走看看