【乘法游戏】

乘法游戏
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:8 测试通过:1

描述

乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌。最后一次移动后,这里只剩下两张牌。
  你的目标是使得分的和最小。
  例如,如果数是10 1 50 20 5,依次拿1、20、50,总分是10*1*50+50*20*5+10*50*5=8000
  而拿50、20、1,总分是1*50*20+1*20*5+10*1*5=1150。


输入

输入文件的第一行包括牌数(3<=n<=100),第二行包括N个1-100的整数,用空格分开。

输出

最小得分

样例输入

6
10 1 50 50 20 5


样例输出

3650


提示

http://www.tyvj.cn/Problem_Show.asp?id=1014

 1 #include <iostream>
 2 using namespace std;
 3 
 4 #define MAXN 210
 5 
 6 typedef unsigned long long int longint;
 7 
 8 const longint INF = 1 << 31;
 9 
10 longint a[MAXN];
11 
12 longint dp[MAXN][MAXN];
13 
14 int n;
15 
16 void iInit()
17 {
18     for (int i = 1; i <= n; i++)
19     {
20         cin >> a[i];
21     }
22 }
23 
24 void iDynamicProgramming()
25 {
26     for (int i = n - 2; i >= 1; i--)
27     {
28         for (int j = i + 2; j <= n; j++)
29         {
30             longint max = INF;
31             for (int k = i + 1; k <= j - 1; k++)
32             {
33                 if (max > dp[i][k] + dp[k][j] + a[i] * a[k] * a[j])
34                 {
35                     max = dp[i][k] + dp[k][j] + a[i] * a[k] * a[j];
36                 }
37             }
38             dp[i][j] = max;
39         }
40     }
41 }
42 
43 void iShowResult()
44 {
45     cout << dp[1][n] << endl;
46 }
47 
48 int main()
49 {
50 
51     while (cin >> n)
52     {
53         iInit();
54 
55         iDynamicProgramming();
56 
57         iShowResult();
58 
59     }
60     return 0;
61 }
62 
63 // end
64 // ism
原文地址:https://www.cnblogs.com/ismdeep/p/2602289.html