POJ1651 区间dp
来源:互联网 发布:遗传算法岛屿模型 编辑:程序博客网 时间:2024/06/05 14:35
Description
The goal is to take cards in such order as to minimize the total number of scored points.
For example, if cards in the row contain numbers 10 1 50 20 5, player might take a card with 1, then 20 and 50, scoring
If he would take the cards in the opposite order, i.e. 50, then 20, then 1, the score would be
Input
Output
Sample Input
610 1 50 50 20 5
Sample Output
3650
题意:给你一个序列,然后让你对他进行移动,顺序任意,每次移动代价是该位置上的数*其左边的第一个数*其右边第一个数,第一个数和最后一个数不能移,让你求出将中间数全部移除之后的最小代价。
思路:一个区间dp,dp[i][j]表示从i到j的最优解,可以考虑从i到k,k+1到j的最小代价,然后可以推出状态转移方程如下;
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j]);
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
const int INF=0x4fffffff;//无穷大
int a[maxn];
int dp[maxn][maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int l=2;l<n;l++)//第一个和最后一个不能移,枚举区间长度
{
for(int i=0;i<=n-l+1;i++)//生成左右区间
{
int j=i+l-1;
dp[i][j]=INF;
for(int k=i;k<j;k++)//枚举中点
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j]);
}
}
}
printf("%d\n",dp[2][n]);
}
return 0;
}
- poj1651 (区间dp)
- poj1651(区间DP)
- poj1651,区间dp
- poj1651(区间dp)
- poj1651 区间dp
- poj1651 区间dp
- poj1651(区间dp)
- 区间dp(poj1651)
- poj1651 区间dp
- poj1651 区间dp入门
- POJ1651 区间dp
- POJ1651:Multiplication Puzzle(区间DP)
- poj1651 Multiplication Puzzle 区间dp
- POJ1651-Multiplication Puzzle-区间DP
- POJ1651:Multiplication Puzzle(区间DP)
- POJ1651 Multiplication Puzzle 区间DP
- poj1651 Multiplication Puzzle(区间dp)
- poj1651 Multiplication Puzzle 【区间dp】
- 线段树练习题三
- PHP在windows和Linux下安装redis扩展
- hdu2181哈密顿绕行世界问题
- presto配置及练习
- CSS
- POJ1651 区间dp
- LZO--实时数据压缩库
- 管道和重定向
- 腾讯2017年后台实习生面经:hr面被刷
- 安卓Android关于adb服务不能运行的问题
- 背包问题-动态规划-JAVA
- 更加成熟的领导力素质和学习敏感度
- SQLAlchemy ORM教程之一:Create
- 外观模式--高层调用,删繁就简(结构型模式04)