• POJ 1651 区间DP Multiplication Puzzle


    此题可以转化为最优矩阵链乘的形式,d(i, j)表示区间[i, j]所能得到的最小权值。

    枚举最后一个拿走的数a[k],状态转移方程为d(i, j) = min{ d(i, k) + d(k, j) + a[i] * a[k] * a[j] }

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int maxn = 100 + 10;
     8 const int INF = 0x3f3f3f3f;
     9 
    10 int n;
    11 
    12 int a[maxn];
    13 int d[maxn][maxn];
    14 
    15 int DP(int i, int j)
    16 {
    17     if(j <= i + 1) return 0;
    18     int& ans = d[i][j];
    19     if(ans >= 0) return ans;
    20     ans = INF;
    21     int t = a[i] * a[j];
    22     for(int k = i + 1; k < j; k++) ans = min(ans, DP(i, k) + DP(k, j) + t * a[k]);
    23     return ans;
    24 }
    25 
    26 int main()
    27 {
    28     while(scanf("%d", &n) == 1 && n)
    29     {
    30         for(int i = 0; i < n; i++) scanf("%d", a + i);
    31         memset(d, -1, sizeof(d));
    32         printf("%d
    ", DP(0, n - 1));
    33     }
    34 
    35     return 0;
    36 }
    代码君
  • 相关阅读:
    实现跨域的几种方法
    2015-07-15
    unity3d中给GameObject绑定脚本的代码
    unity3d的碰撞检测及trigger
    区块链 (未完)
    mono部分源码解析
    量化策略分析的研究内容
    mono搭建脚本整理
    unity3d简介
    Hook技术之API拦截(API Hook)
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4696975.html
Copyright © 2020-2023  润新知