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 蜘蛛牌 (区间型动态规划)的更多相关文章
- HDOJ1584蜘蛛牌【DFS】
10张牌,大的只能跟小的跑,可以针对每一个状态进行搜索,求一个最小的移动距离. 但是不会怎么遍历整个状态是硬伤? 因为只能大的跟着小的. 先把小的标记,去寻找大的点,最终一定是满足的吧. 比如先标记1 ...
- ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)
Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...
- 【算法•日更•第十期】树型动态规划&区间动态规划:加分二叉树题解
废话不多说,直接上题: 1580:加分二叉树 时间限制: 1000 ms 内存限制: 524288 KB提交数: 121 通过数: 91 [题目描述] 原题来自:NOIP 20 ...
- 区间型DP
区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...
- HDU-1584 蜘蛛牌(dfs)
可以多看看. 蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 区间型动规--石子归并(Pascal)
题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...
- 蜘蛛牌(hdu 1584 DFS)
蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 树型动态规划(树形dp)
树型动态规划就是在“树”的数据结构上的动态规划,树型动态规划是建立在树上的,所以有二个方向: 1.根—>叶:这种题目基本上碰不到 2.叶->根:根的子节点传递有用的信息给根,完后根得出最优 ...
- F - 蜘蛛牌(深度搜索)
Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么 ...
随机推荐
- 【FOI】异或问题
题意: 给出n个数ai 和m个操作 操作有两种 C x y:将ax的值改为y Q x:求几种方案使得 b1^b2^...^bn=x(ai>=bi) 题解: 先推荐一个不错的题解 题目差不多 我之 ...
- Sublime Text2 中Emmet(之前叫Zencoding)插件安装以及使用
一.添加插件之前先 下载Package Control 按 Ctrl+`(就是~这个键) 复制下面的代码 确认 重新启动sublime text2 import urllib2,os;pf='Pack ...
- Activity详解
Activity是android应用的重要组成单元之一(另外3个是Service,BroadcastReceiver和ContentProvider).实际应用包含了多个Activity,不同的Act ...
- PowerDesigner 企业架构模型 ( EAM )
PowerDesigner 企业架构模型 ( EAM ) 说明 file工作数据库框架application网络 目录(?)[+] 一. 企业架构模型 说明 EnterpriseArchite ...
- Volley使用指南第一回(来自developer.android)
最近闲来想看看android网络方面的东西.google在2013年发布了一个叫做Volley的网络请求框架,我看了一下官网,居然在training里面就有教程.首先,英文的东西看着 还是挺不爽的,特 ...
- Codeforces Round #322 (Div. 2) B. Luxurious Houses 水题
B. Luxurious Houses Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/pr ...
- 支持向量机(SVM)算法的matlab的实现
支持向量机(SVM)的matlab的实现 支持向量机是一种分类算法之中的一个,matlab中也有对应的函数来对其进行求解:以下贴一个小例子.这个例子来源于我们实际的项目. clc; clear; N= ...
- Android下pm命令详解
在看相关PackageManager代码时,无意中发现Android 下提供一个pm命令,通常放在/system/bin/下.这个命令与Package有关,且非常实用.所以研究之. 0. Usage: ...
- windows8 认识及使用
windows8的一次技术分享. 利用国庆宅家的几天,在跑不动XP的老笔记本上装了win8,嘿,跑的溜溜的,一高兴做个ppt给公司的同事们介绍介绍,随意之作,勿较真抬杠,呵呵. 文件地址:http:/ ...
- NET中間語言(IL) 图解
转载地址是:http://msdn.microsoft.com/zh-tw/library/dd229210.aspx 想查看IL指令,请看中英文对照表: CN-http://www.cnblogs. ...