UVA 10269 Super Mario,最短路+动态规划
这个题目我昨晚看到的,没什么思路,因为马里奥有boot加速器,只要中间没有城堡,即可不耗时间和脚力,瞬间移动不超过L距离,遇见城堡就要停下来,当然不能该使用超过K次。。。我纠结了很久,最终觉得还是只能写个BFS,剪了下枝,不出意料还是TLE。。。
后来还是找的别人博客看了一下。。。其实之前也做了好多DP,也应该能想到,既然加速器可以用k次,则,每个点都有k个状态,通过DP,把各个状态进行下取优,就可以了。。。
这不得不让我对DP有了些新的理解,DP在状态转移的时候,就好像最短路里面的松弛操作,或者二者只是外表的不同,本质是遵循一个道理。
当然在DP之前还需要一些处理
首先用个g[][]二维数组把题目所给的路径给存下来,再用Floyd把点到点的最短路先求出来,当然不是完全的Floyd,因为这个floyd求出来的最短路完全是为了之后用加速器,加速器不允许途中有城堡,因此在floyd的时候要加判断条件,有城堡在中间就不走。
用一个d[i][k]表示i点在加速器使用了k次的最短路径。
一开始还以为是总加速距离不能超过L,后来发现原来是每次。要细心
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 110
#define INF 1<<29
using namespace std;
int A,B,M,L,K;
int g[N][N],d[N][];
int q[N*],st[N*],inq[N][];
void init()
{
for (int i=;i<=A+B;i++)
{
for (int j=;j<=A+B;j++)
{
if (i==j){
g[i][j]=;
}
else
g[i][j]=INF;
}
}
}
void floyd()
{
int i,j,k;
for (k=;k<=A+B;k++)
{
for (i=;i<=A+B;i++)
{
for (j=;j<=A+B;j++)
{
if (k>A) continue;//Floyd 只求能用加速器飞越的最短路
if (g[i][j]>g[i][k]+g[k][j])
g[i][j]=g[i][k]+g[k][j];
//cout<<g[i][j]<<" "<<i<<" "<<j<<endl;
}
}
}
}
void solve()
{
int maxn=(K+)*(A+B);
int front=,rear=;
memset(inq,,sizeof inq);
for (int i=;i<=A+B;i++)
{
for (int j=;j<=K;j++)
{
d[i][j]=INF;
//cout<<d[i][j]<<endl;
}
}
d[A+B][]=; //初始状态
q[rear]=A+B; //这次尝试了一下手动队列,而不是STL队列,效果相同,不过手工的队列时间应该好一些。
st[rear]=;
rear++;
while (front!=rear)
{
int u=q[front];
int k=st[front];
front++;
if (front>maxn)
front=;
inq[u][k]=;
// cout<<u<<" "<<k<<" "<<d[u][k]<<endl;
for (int i=;i<=A+B;i++)
{
if (d[i][k]>d[u][k]+g[u][i]) //进行普通最短路,保存当前状态
{
d[i][k]=d[u][k]+g[u][i];
if (!inq[i][k])
{
q[rear]=i;
st[rear]=k;
rear++;
if (rear>maxn)
rear=;
inq[i][k]=;
}
}
if (g[u][i]<=L && k<K && d[u][k]<d[i][k+]) //如果能够进行加速,并且加速后能更新加速后的状态,则加速,并且保存该状态。
{
d[i][k+]=d[u][k];
if (!inq[i][k+])
{
inq[i][k+]=;
q[rear]=i;
st[rear]=k+;
rear++;
if (rear>maxn)
rear=;
}
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{ scanf("%d%d%d%d%d",&A,&B,&M,&L,&K);
init();
for (int i=;i<=M;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=g[b][a]=c;
}
floyd();
solve();
int ans=INF;
for (int i=;i<=K;i++)
if (ans>d[][i])
ans=d[][i];
printf("%d\n",ans);
}
return ;
}
其实整个动规过程就是最短路的松弛过程,尤其是它把每个点的状态都求到了,并且把松弛成功(或者说状态转移成功)的点又存贮进了队列,以它来继续寻求更新其他点,这种思想应该可以再用到以后其他的DP问题中
UVA 10269 Super Mario,最短路+动态规划的更多相关文章
- zoj1232Adventure of Super Mario(图上dp)
题目连接: 啊哈哈.点我点我 思路: 这个题目是一个图上dp问题.先floyd预处理出图上全部点的最短路,可是在floyd的时候,把可以用神器的地方预处理出来,也就是转折点地方不能为城堡..预处理完成 ...
- UVA10269 Adventure of Super Mario(Floyd+DP)
UVA10269 Adventure of Super Mario(Floyd+DP) After rescuing the beautiful princess, Super Mario needs ...
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Teaching Your Computer To Play Super Mario Bros. – A Fork of the Google DeepMind Atari Machine Learning Project
Teaching Your Computer To Play Super Mario Bros. – A Fork of the Google DeepMind Atari Machine Learn ...
- hdu4177:Super Mario
主席树+离散化.给一段区间.多次询问[l,r]中有多少个数小于k.啊主席树用指针版写出来优美多了QAQ... #include<cstdio> #include<cstring> ...
- 主席树:HDU 4417 Super Mario
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu4417 Super Mario 树阵离线/划分树
http://acm.hdu.edu.cn/showproblem.php?pid=4417 Super Mario Time Limit: 2000/1000 MS (Java/Others) ...
- Super Mario
Super Mario Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- UVA - 12298 Super Poker II NTT
UVA - 12298 Super Poker II NTT 链接 Vjudge 思路 暴力开个桶,然后统计,不过会T,用ntt或者fft,ntt用个大模数就行了,百度搜索"NTT大模数&q ...
随机推荐
- python 编写程序输出50以内勾股数,如下图所示,要求每组显示六祖,各组勾股数无重复
import math n = 0 for a in range(1,49): for b in range(a,49): c = math.ceil(math.sqrt(a**2+b**2)) if ...
- python面试题整理(二)
1.进程,线程,协程定义,有什么区别 进程是操作系统分配资源的最小单位,一个进程对应一块CPU 线程是进程中的某一个控制单元,是CPU调度的最小单元,线程之间相互独立,进程结束线程也会结束,一个进程至 ...
- 第二阶段scrum-10
1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 等待发布
- spring监听器+定时任务
背景:在原SSM项目中,拟定在每晚的23:59:59执行一个批处理任务. 设计思路:用jdk自带的定时器触发任务执行,设置下次执行间隔为24小时.定时任务由spring的监听器去启动. jdk版本:1 ...
- 14 —— npm —— 基本使用 ——初始化项目
概念:类似积木,可以组装成各种应用 node 的强大之处 : 可以随意使用这些组件 一,npm 是什么: nodejs 自带的包(模块)管理工具 二,查看 npm 的所有选项 三,查看各个选项的具体作 ...
- DNS bind9安装
参考 111 首先要成功安装Centos操作系统,最新版本是Centos 6.4版本,最小化安装. [root@localhost named]# ifconfig -a 0 1 eth1 ...
- 2.10 Jetpack LiveData部分
LiveData是一个可观察的数据持有者类,但和其他的可观察对象不同,它与生命周期相关联,比如Activity的生命周期.LiveData能确保仅在Activity处于活动状态下才会更新.也就是说当观 ...
- 一、CI框架(CodeIgniter)简介
CI是一个非常好用,非常灵活的PHP框架,在官网https://codeigniter.org.cn/ :最新版本3.1.10 版 就可以尽情使用了. 不忘初心,如果您认为这篇文章有价值,认同作者的付 ...
- Python win32api.keybd_event模拟键盘输入
win32api.keybd_event 该函数原型:keybd_event(bVk, bScan, dwFlags, dwExtraInfo) 第一个参数:虚拟键码(键盘键码对照表见附录): 第二个 ...
- CCCC 连续因子
题意: 一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为3*5*6*7,其中5.6.7就是3个连续的数字.给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列 ...