动态规划训练8 [E
来源:互联网 发布:excel保存数据丢失 编辑:程序博客网 时间:2024/05/16 09:02
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][n]<<endl;}
阅读全文
0 0
- 动态规划训练8 [E
- Problem E 动态规划
- ACM动态规划训练
- 动态规划训练专题
- 动态规划训练专题
- 动态规划专题训练
- 动态规划—Problem E
- CodeForces 148E(动态规划)
- 算法训练-动态规划基础
- 动态规划训练(2)
- 动态规划训练12 [G
- 动态规划专项训练(1)
- 动态规划专项训练(2)
- CSU-ACM2017暑期训练8-动态规划初步 F
- CSU-ACM2017暑期训练8-动态规划初步 C
- CSU-ACM2017暑期训练8-动态规划初步 D
- codeforces 182E Wooden Fence 动态规划
- 动态规划训练第一阶段(for初学者)
- linux-redis页面报500无法正常处理请求的方案
- JS 判断 图片上传_限制格式、类型、尺寸
- android中string.xml中%1$s、%1$d 的简单用法
- lua 在 windows 系统的环境配置
- 75-Sort Colors
- 动态规划训练8 [E
- 扫描识别控件Dynamic Web TWAIN v13.0发布,新增统一的Dynamsoft服务
- 请求网络数据过程中弹出框
- oracle数据库建立transTitle(俩个Function,一个Type)20170622
- OkHttp使用教程
- .NET Core 获取GET,Post 参数
- 高并发的核心技术-幂等的实现方案
- 使用Node 搭建HTTPS服务
- layoutstretch 控件按比例扩大缩小