动态规划训练8 [E - Multiplication Puzzle POJ1651]
2017-06-22 14:29
330 查看
Multiplication Puzzle
POJ - 1651 题意:
在一个序列中,拿走一个数字,那么得分就是这个数字以及它相邻的两个数字,这三个数字的乘积。求最小得分。
这道题乍一看感觉是区间DP,但是需要逆向思考的技巧。
记dp[i][k]表示以i开头的,长度k的区间。
我们考虑一个区间的时候,记录区间的两个端点分别为l,r。
这个区间两侧的端点是不能被拿走的,那么我们考虑最后一个被拿走的数字k,它的得分一定是区间端点的两个数和它的乘积(a[l]*a[k]*a[r])。
然后我们考虑区间[l,k]之间的情况,这个区间被拿的只剩下区间两个端点了,所以可以直接用子结构dp[l][k-l+1]。
同理区间p[k,r]也被拿的只剩下区间的两个端点了,直接用子结构dp[k][r-l-k+1]
这样的话递推式就非常的清晰了。
dp[i][k] = min(dp[i][k],dp[i][j+1] + dp[i+j][k-j] + a[i]*a[i+j]*a[i+k-1]);//
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int MAX = 106; int dp[MAX][MAX]; int a[MAX]; int n; int main(){ scanf("%d",&n); for(int i = 0;i < n;i++){ cin>>a[i]; } for(int k = 3;k <= n;k++){ for(int i = 0 ;i + k <= n;i++){ dp[i][k] = 1e9; for(int j = 1;j < k-1;j++){ dp[i][k] = min(dp[i][k],dp[i][j+1] + dp[i+j][k-j] + a[i]*a[i+j]*a[i+k-1]); } } } cout<<dp[0] <<endl; }
相关文章推荐
- CSU-ACM2017暑期训练8-动态规划初步 D - Longest Ordered Subsequence
- 蓝桥杯 算法训练 最大的算式 (动态规划)
- 蓝桥杯 ALGO-30算法训练 入学考试(01背包,动态规划)
- 暑假集训-训练6 动态规划初步
- 【【henuacm2016级暑期训练】动态规划专题 F】Physics Practical
- 【【henuacm2016级暑期训练】动态规划专题 M】Little Pony and Harmony Chest
- 动态规划训练(3)题解
- 动态规划训练12 [G - You Are the One HDU - 4283 ]
- 动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]
- 动态规划训练21 [FatMouse and Cheese HDU - 1078 ]
- 算法训练 K好数 [动态规划]
- 算法训练 数的划分 (动态规划)
- 复试训练——动态规划——最长递增子序列
- 【ACM训练计划】 HDU 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】
- 【141106noip训练】动态规划第三题:尼克的任务
- 蓝桥杯 ALGO-31算法训练 开心的金明(01背包,动态规划)
- 【 【henuacm2016级暑期训练】动态规划专题 G】 Palindrome pairs
- 动态规划训练22 [Milking Time POJ - 3616 ]
- 算法训练 K好数 [动态规划]
- 蓝桥杯 ALGO-11算法训练 瓷砖铺放(递归/动态规划)