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 ...
随机推荐
- 洛谷 三月月赛 A
模拟模拟 #include<bits/stdc++.h> using namespace std; inline int ra() { ,f=; char ch=getchar(); ; ...
- 四十八、在SAP中函数参数的使用
一.不带参数的函数定义如下 二.我们把函数内部会变化的变量以参数的形式定义,其中USING和CHANGING分别表示变量和返回值,因为so_car表示的是工作区,所以后面加上[]符号. 三.我们把2个 ...
- 091-PHP数组过滤函数array_filter,过滤非整数
<?php function not_int($x){ //定义过滤非整数的函数 if(is_int($x)) return TRUE; } $arr=array(1,2,'a',3,4,'c' ...
- 【NOIP2009】Hankson的趣味题
题意:给出 \(a_0\), \(a_1\), \(b_0\), \(b_1\), 求出正整数 \(x\) 的个数,\(x\) 满足: \(gcd(x,a_0)=a_1\) , \(lcm(x, b_ ...
- hdu1222Wolf and Rabbit (公约数的巧题)
一个很坑的问题,想到点子上很好解决,想不到的话头破也不一定能做出来. There is a hill with n holes around. The holes are signed from 0 ...
- 十一、React 获取服务器数据: axios插件、 fetch-jsonp插件的使用
react获取服务器APi接口的数据: react中没有提供专门的请求数据的模块.但是我们可以使用任何第三方请求数据模块实现请求数据 一.axios 获取Api数据 使用文档:https://www. ...
- js运用sort对json 数组进行排序
Array.sort()方法是用来对数组项进行排序的 ,默认情况下是进行升序排列.sort() 方法可以接受一个 方法为参数. sort()排序时每次比较两个数组项都回执行这个参数,并把两个比较的数组 ...
- exgcd详解
注:本文中所有 \(\%\) 号均表示取模, \(gcd(a,b)\) 表示 \(a\) 和 \(b\) 的最大公因数 1.exgcd是什么? exgcd大名扩展欧几里得算法,用来求形如 \(gcd( ...
- 语句:{% url menu.url_name %}的作用
语句: {% url menu.url_name %} 表示跳转,上面的menu.url_name意思是menu表的url_name字段 如果menu表的url_name字段的值是sales_dash ...
- ACM&OI 基础数学算法专题
[前言] 本人学习了一定时间的算法,主要精力都花在数学类的算法上面 而数学类的算法中,本人的大部分精力也花费在了数论算法上 此类算法相对抽象,证明过程比较复杂 网络上的博客有写得非常好的,但也有写得不 ...