hdoj1584

分析:

f[i][j] 表示 把一串牌 牌 i 到 j 摞为一摞时 所花费最少的步数。

d[i][j] 表示把牌 i 挪到牌 j 上时需要走的步数(最初给的状态)。

以一串牌 3~8 为例, 我们需要把牌 3 放到牌 4 上 , 而在最优的移动方案下, 牌 4 的位置不确定, 所以我们枚举牌 4 所在的位置(因为一共10张牌, 枚举是可以的) 。 得出状态转移方程 : f[3][8] = min(f[3][8], f[4][k] + f[k][8] + d[3][k]); ( 4 <= k <= 8)。 f[i][j] = min (f[i][j], f[i+1][k] + f[k][j] + d[i][k]); 

举个例子: 牌的初始顺序为 1, 4, 6, 8, 3, 2, 5, 7, 9, 10 
求f[1][4] 时。 最有顺序应该是 : 先把牌 2 移到 牌 3 上, 把牌 2~3 移到牌 4 上。 最后 把牌 1 移到 牌 2 上。 而此时牌 2 已经在 牌4 的位置上了(f[1][4] = f[2][4] + f[4][4] +  d[1][4] = 5)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std; int t, a[], d[][], f[][];
void dp()
{
for(int i = ; i < ; i++)//所求的区间不断增大, 先求距离小的区间, 得出最优子问题解
{
for(int j = ; j <= ; j++)//所求将一串牌 j 到 i+j 摞成一摞时最小步数。
{
if(i + j > ) continue;
for(int k = j + ; k <= i + j; k++)//枚举上一张牌所在的位置
f[j][i+j] = min(f[j][i+j], f[j+][k] + f[k][i+j] + d[j][k]);
}
}
}
void Init()
{
for(int i = ; i <= ; i++)
scanf("%d", &a[i]);
memset(d, , sizeof(d));
for(int i = ; i <= ; i++)//将所有距离预处理下
{
for(int j = ; j <= ; j++)
{
int x = a[i], y = a[j];
d[x][y] = abs(i - j);
d[y][x] = d[x][y];
}
}
}
int main()
{
cin >> t;
while(t--)
{
for(int i = ; i <= ; i++)
{
for(int j = ; j <= ; j++)
{
f[i][j] = 10e8;
if(i == j)
f[i][j] = ;
}
}
Init();
dp();
printf("%d\n", f[][]);
}
return ;
}

hdoj1584 蜘蛛牌 (区间型动态规划)的更多相关文章

  1. HDOJ1584蜘蛛牌【DFS】

    10张牌,大的只能跟小的跑,可以针对每一个状态进行搜索,求一个最小的移动距离. 但是不会怎么遍历整个状态是硬伤? 因为只能大的跟着小的. 先把小的标记,去寻找大的点,最终一定是满足的吧. 比如先标记1 ...

  2. ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)

    Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...

  3. 【算法•日更•第十期】树型动态规划&区间动态规划:加分二叉树题解

    废话不多说,直接上题: 1580:加分二叉树 时间限制: 1000 ms         内存限制: 524288 KB提交数: 121     通过数: 91 [题目描述] 原题来自:NOIP 20 ...

  4. 区间型DP

    区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...

  5. HDU-1584 蜘蛛牌(dfs)

    可以多看看. 蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. 区间型动规--石子归并(Pascal)

    题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...

  7. 蜘蛛牌(hdu 1584 DFS)

    蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 树型动态规划(树形dp)

    树型动态规划就是在“树”的数据结构上的动态规划,树型动态规划是建立在树上的,所以有二个方向: 1.根—>叶:这种题目基本上碰不到 2.叶->根:根的子节点传递有用的信息给根,完后根得出最优 ...

  9. F - 蜘蛛牌(深度搜索)

    Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么 ...

随机推荐

  1. Hadoop概念学习系列之hadoop、spark常备查询网址(二十九)

    http://archive.apache.org/dist

  2. HTML中noscript的用法

    noscript 元素用来定义在脚本未被执行时的替代内容(文本).此标签可被用于可识别 <script> 元素用来定义在脚本未被执行时的替代内容(文本). 标签但无法支持其中的脚本的浏览器 ...

  3. 转载 : Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结 投稿:jingxian 字体:[增加 减小] 类型:转载 时间:2013-11-14我要评论 本文是 ...

  4. 关于 JavaScript 数据类型判断

    在 JavaScript 中,有 undefined.null.number.string.boolean 五种基本数据类型,另外,有一种复杂数据类型 object ,类似于 C# 中值类型.引用类型 ...

  5. javaScript 要点(十五)HTML DOM 导航

    通过 HTML DOM,能够使用节点关系在节点树中导航. 1.HTML DOM 节点列表 getElementsByTagName() 方法返回节点列表.节点列表是一个节点数组. 下面的代码选取文档中 ...

  6. Xcode8 创建NSManageObject subclass方法

    更新iOS8之后发现coredata也做了一些改变,创建本地的时候一脸懵逼,最后发现: 喜极而泣不能自已,(-.-!)

  7. Asp.Net事务和异常处理:

    Asp.Net事务和异常处理: 一.什么是事务处理? 事务处理是一组组和成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性. 如果在事务过程中没有遇到错误, ...

  8. CocoaPods使用命令

    5.需要在工程中创建一个Podfile文件, 使用命令: $cd /Users/shiyunlei/Desktop/CocoapodsSample(进入工程目录,cd后面的是工程的路径) $ touc ...

  9. POJ 3080 Blue Jeans (KMP)

    求出公共子序列  要求最长  字典序最小 枚举第一串的所有子串   然后对每一个串做KMP.找到目标子串 学会了   strncpy函数的使用   我已可入灵魂 #include <iostre ...

  10. RotatingDoughnut

      RotatingDoughnut.zip