[DP]JZOJ 5907 轻功

Description

题目背景:
尊者神高达进入了基三的世界,作为一个 mmorpg 做任务是必不可少的,然而跑地图却令人十分不爽。好在基三可以使用轻功,但是尊者神高达有些手残,他决定用梅花桩练习轻功。
题目描述:
一共有 n 个木桩,要求从起点(0)开始,经过所有梅花桩,恰好到达终点 n,尊者神高达一共会 k 种门派的轻功,不同门派的轻功经过的梅花桩数不同,花费时间也不同。但是尊者神高达一次只能使用一种轻功,当他使用别的门派的轻功时,需要花费 W 秒切换(开始时可以是任意门派,不需要更换时间)。由于尊者神高达手残,所以经过某些梅花桩(包括起点和终点)时他不能使用一些门派的轻功。尊者神高达想知道他最快多久能到达终点如果无解则输出-1。

Input

第一行 n,k,W
接下来 k 行,每行为 ai 和 wi 代表第 i 种轻功花费 vi 秒经过 ai 个木桩。
接下来一行 Q 为限制条件数量。
接下来 Q 行,每行为 xi 和 ki 代表第 xi 个梅花桩不能使用第 ki 种门派的轻功经过。

Output

一行答案即所需最短时间。

Sample Input

Sample Input1:
6 2 5
1 1
3 10
2
1 1
2 1

Sample Input2:
6 2 5
1 1
3 10
0

 

Sample Output

Sample Output1:
18

样例解释 1:
先用第二种轻功花费 10 秒到 3,再用 5 秒切换到第一种轻功,最后再用 3 秒时间到 6.一共花费 10+5+3=18 秒

Sample Output2:
6

样例解释 2:
直接花费 6 秒到 6;

Data Constraint

20%的数据 n<=20,k<=10,Q<=200;
对于另外 20%的数据 W=0
对于另外 20%的数据 Q=0
所以数据满足 n<=500,k<=100,Q<=50000,vi<=1e7;
保证数据合法

Hint

Q:请问第一题可不可以往回跳
A:不可以

分析

这题简单的DP,关键是怎么判断轻功在这一段中可用

建一个h[i][j]表示在从起点到第i个桩子,j的功法被禁用的次数(就是前缀和)

然后减一下为0就可以转移啦

#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
typedef long long ll;
const int N=5e2+10;
const int K=1e2+10;
ll w[K],a[K];
int n,k,q;
ll W;
ll f[N][K];
int h[N][K];

int main() {
    freopen("qinggong.in","r",stdin);
    freopen("qinggong.out","w",stdout);
    scanf("%d%d%lld",&n,&k,&W);
    for (int i=1;i<=k;i++) scanf("%lld%lld",&a[i],&w[i]);
    scanf("%d",&q);
    for (int i=1;i<=q;i++) {
        int a,b;
        scanf("%d%d",&a,&b);
        h[a][b]=1;
    }
    for (int i=1;i<=n;i++)
        for (int j=1;j<=k;j++)
            h[i][j]+=h[i-1][j];
    for (int i=1;i<=n;i++)
        for (int j=1;j<=k;j++)
            f[i][j]=1ll<<62;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=k;j++)
            for (int l=1;l<=k;l++)
                if (i-a[l]>=0&&h[i][l]-h[i-a[l]][l]==0&&f[i-a[l]][j]!=1ll<<62)
                    f[i][l]=min(f[i][l],f[i-a[l]][j]+w[l]+(j==l?0:W));
    ll ans=1ll<<62;
    for (int i=1;i<=k;i++)
        ans=min(ans,f[n][i]);
    printf("%lld",ans==1ll<<62?-1:ans);
    fclose(stdin);fclose(stdout);
} 

原文地址:https://www.cnblogs.com/mastervan/p/9800880.html

时间: 2024-10-21 17:35:10

[DP]JZOJ 5907 轻功的相关文章

[容斥原理][dp]JZOJ P3056 数字

[问题描述] 一个数字被称为好数字当他满足下列条件: 1. 它有2*n个数位,n是正整数(允许有前导0) 2. 构成它的每个数字都在给定的数字集合S中. 3. 它前n位之和与后n位之和相等或者它奇数位之和与偶数位之和相等 例如对于n=2,S={1,2},合法的好数字有1111,1122,1212,1221,2112,2121,2211,2222这样8种. 已知n,求合法的好数字的个数mod 999983. Input 第一行一个数n. 接下来一个长度不超过10的字符串,表示给定的数字集合. Ou

[概率期望DP]JZOJ 4212 我想大声告诉你

Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一些人,小R 自然也参加了.这个游戏有n 个人参加,每一轮随机选出一个还没有出局的人x,接着x 会出局.x 在出局之后剩下的人会受到一次攻击,每一个人在遭到攻击之后会有p 的概率出局.(注意遭到攻击出局的人是不能攻击剩下的人的)在所有人都出局之后,遭受攻击次数等于特定值的人能够成为胜者.所以现在小R 想要知道对于每一个0 <= k < n,自己恰好在遭受k 次攻击之后出局的概率是多

[Tarjan][并查集][dp] Jzoj P4253 QYQ在艾泽拉斯

Description 在艾泽拉斯的无尽之海里,有着一群不为人知的由各个种族的冒险者统治的岛屿,这些岛屿都很庞大,足以在上面建造许多的城市,城市之间有一些单向道路连接.有一天,QYQ无意中发现了这些岛屿,并且发现在每个城市的地下都或多或少埋藏着一些装备.金币.宝物……可是正当QYQ兴奋不已打算全部把它们拿走时,他却惊奇的发现你的魔法在这里被限制住了,唯一可用的技能就是闪现,而且魔法只够他使用K次这个技能了,每次使用这个技能QYQ只能从一个岛屿上闪现到另外一个岛屿上.每一个岛屿只能登上一次,QYQ

[概率dp] Jzoj P4212 我想大声告诉你

Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一些人,小R 自然也参加了.这个游戏有n 个人参加,每一轮随机选出一个还没有出局的人x,接着x 会出局.x 在出局之后剩下的人会受到一次攻击,每一个人在遭到攻击之后会有p 的概率出局.(注意遭到攻击出局的人是不能攻击剩下的人的)在所有人都出局之后,遭受攻击次数等于特定值的人能够成为胜者.所以现在小R 想要知道对于每一个0 <= k < n,自己恰好在遭受k 次攻击之后出局的概率是多

[概率dp] Jzoj P2059 卡牌游戏

题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把卡片上的数字向所有玩家展示,然后按顺时针从庄家位置数第X个人将被处决即退出游戏.然后卡片将会被放回卡牌堆里并重新洗牌.被处决的人按顺时针的下一个人将会作为下一轮的庄家.那么经过N-1轮后最后只会剩下一个人,即为本次游戏的胜者.现在你预先知道了总共有M张卡片,也知道每张卡片上的数字.现在你需要确定每个

[数学][dp] Jzoj P4236 登山

Description 恶梦是一个登山爱好者,今天他来到了黄山.俗话说的好,不走回头路.所以在黄山,你只能往前走,或者往上走.并且很显然的是,当你走到山脊的时候,你不能够往上走,你只能往前走一步再往上走.抽象一点而言就是,你可以把黄山视为一个N * N格点图,恶梦从(0,0)开始出发,要走到(N,N).当他走到位置(x,y)的时候,它可以往(x + 1,y),或(x,y+1)走.并且当他走到(x,x)的时候,由于他已经处在了山脊上,所以他不能够往(x,x+1)方向上走.当恶梦兴致勃勃准备开始爬山

[数位DP]JZOJ 4239 光棍

Description 快要到七夕了,又到了交(nue)往(gou)的季节.恶梦坐在教室里,作为一个纯屌丝的他当然不会关心要送什么礼物给女生,然而他的前桌yves却在忙碌着各种各样的的短信.恶梦注意到yves发短信给的电话号码似乎都满足着特别的性质,难道yves的"好朋友"是满足正态分布的?由于yves有着自己最喜欢的数字a,2 <= a <= 9恶梦从这里入手,发现了一些端倪.假设yves发的电话号码是一个十进制数字S恶梦发现S会满足以下三个性质中的一个1. S是a的倍数

[组合数学][计数DP]JZOJ 4254 集体照

Description 一年一度的高考结束了,我校要拍集体照.本届毕业生共分n个班,每个班的人数为Ai.这次拍集体照的要求非常奇怪:所有学生站一排,且相邻两个学生不能同班.现在,安排这次集体照的老师找到了你,想问问你一共有多少种方案.方案数可能很大,最终结果对1,000,000,007取模. Input 输入文件名为photo.in.第一行为为一个整数n.第二行为n个正整数,分别为每个班的人数. Output 输出文件photo.out,共1行,为总方案数. Sample Input 输入1:

[单调队列优化DP]JZOJ 3128 跳格子

Description 奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3 <=N <= 250,000),编号为1..N. 就像任何一个好游戏一样,这样的跳格子游戏也有奖励!第i个格子标有一个数字V_i(-2,000,000,000 <=V_i <= 2,000,000,000)表示这个格子的钱.奶牛们想看看最后谁能得到最多的钱. 规则很简单: * 每个奶牛从0号格子出发.(0号格子在1号之前,那里没钱) * 她向N号格子进行一系列的跳