首页 > 其他分享 >luogu P2233 [HNOI2002]公交车路线

luogu P2233 [HNOI2002]公交车路线

时间:2022-09-26 21:36:03浏览次数:61  
标签:const int luogu long HNOI2002 公交站 P2233 dp define

[HNOI2002]公交车路线

题目描述

在长沙城新建的环城公路上一共有 \(8\) 个公交站,分别为 A、B、C、D、E、F、G、H。公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另外一个公交站往往要换几次车,例如从公交站 A 到公交站 D,你就至少需要换 \(3\) 次车。

Tiger 的方向感极其糟糕,我们知道从公交站 A 到公交 E 只需要换 \(4\) 次车就可以到达,可是 tiger 却总共换了 \(n\) 次车,注意 tiger 一旦到达公交站 E,他不会愚蠢到再去换车。现在希望你计算一下 tiger 有多少种可能的乘车方案。

输入格式

仅有一个正整数 \(n\),表示 tiger 从公交车站 A 到公交车站 E 共换了 \(n\) 次车。

输出格式

输出一个正整数表示方案数,由于方案数很大,请输出方案数除以 \(1000\) 后的余数。

样例 #1

样例输入 #1

6

样例输出 #1

8

提示

8 条路线分别是:

(A→B→C→D→C→D→E),(A→B→C→B→C→D→E),

(A→B→A→B→C→D→E),(A→H→A→B→C→D→E),

(A→H→G→F→G→F→E),(A→H→G→H→G→F→E),

(A→H→A→H→G→F→E),(A→B→A→H→G→F→E)。

数据范围

\(4\le n\le10^7\)。

思路

显然我们两维状态dp[i][j]表示当前为第i次乘车 我们在第j个站
切记我们不可从E转移过去 所以我们的答案为dp[n-1][0]+dp[n-1][6]

#include <bits/stdc++.h>
using namespace std;
const int N = 1e7+10;
const int M = 998244353;
const int mod = 1000;
//#define int long long
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int dp[2][7];
void solve() {
    int n;cin>>n;
    dp[0][3]=1;
    for(int i=1;i<n;i++){
        for(int j=0;j<7;j++){
            if(j==0)(dp[i&1][j]=dp[(i-1)&1][j+1])%=mod;
            else if(j==6)(dp[i&1][j]=dp[(i-1)&1][j-1])%=mod;
            else (dp[i&1][j]=dp[(i-1)&1][j-1]+dp[(i-1)&1][j+1])%=mod;
        }
    }
    cout<<(dp[n&1^1][0]+dp[n&1^1][6])%mod<<endl;
}
signed main(){
    fast
    int T;T=1;
    while(T--) {
        solve();
    }
    return ~~(0^_^0);
}

当然我们可以只考虑一边
但是这样我们和A和E一样属于端点 所以dp时要*2

#include <bits/stdc++.h>
using namespace std;
const int N = 1e7+10;
const int M = 998244353;
const int mod = 1000;
//#define int long long
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int dp[2][4];
void solve() {
    int n;cin>>n;
    dp[0][0]=1;
    for(int i=1;i<n;i++){
        for(int j=0;j<4;j++){
            if(j==0)(dp[i&1][j]=2*dp[(i-1)&1][j+1])%=mod;
            else if(j==3)(dp[i&1][j]=dp[(i-1)&1][j-1])%=mod;
            else (dp[i&1][j]=dp[(i-1)&1][j-1]+dp[(i-1)&1][j+1])%=mod;
        }
    }
    cout<<(dp[n&1^1][3]*2)%mod<<endl;
}
signed main(){
    fast
    int T;T=1;
    while(T--) {
        solve();
    }
    return ~~(0^_^0);
}

标签:const,int,luogu,long,HNOI2002,公交站,P2233,dp,define
From: https://www.cnblogs.com/ycllz/p/16732564.html

相关文章

  • luogu P1772 [ZJOI2006] 物流运输 (dp, 最短路)
    https://www.luogu.com.cn/problem/P1772虽然是图论背景,但是1-n天之间是线性关系。没法贪心决策,考虑dp:我本来写的dp是i-1转移到i,但是这样没法处理哪一天能走哪些最短路......
  • luogu P1410 子序列
    子序列题目描述给定一个长度为\(N\)(\(N\)为偶数)的序列,问能否将其划分为两个长度为\(N/2\)的严格递增子序列。输入格式若干行,每行表示一组数据。对于每组数据,首......
  • 【luogu P4218】珠宝商(SAM)(点分治)(根号分治)
    珠宝商题目链接:luoguP4218题目大意给你一棵树,每个点有一个字符。再给你一个字符串s。然后问你树上的所有简单的路径在s上的出现次数的和。思路一个比较神奇的题......
  • luogu P7632 题解
    一.思路我们可以先把时间换成以秒为单位的,然后在枚举每一秒时谁领先。二.重要点我们可以用string读入时间,再用一个函数以秒为单位提取出来(在程序中的函数名:tiqu)......
  • luogu 4025
    [PA2014]Bohater题目描述在一款电脑游戏中,你需要打败\(n\)只怪物(从\(1\)到\(n\)编号)。为了打败第\(i\)只怪物,你需要消耗\(d_i\)点生命值,但怪物死后会掉落血药......
  • luogu6927
    [ICPC2016WF]SwapSpace题面翻译你有\(n\)个硬盘\((n\leqslant10^{6})\),现在需要对所有硬盘进行格式化。格式化后,第\(i\)个硬盘的容量会由原来的\(a_{i}\)变为\(......
  • Luogu T273083 新的题目 题解
    怕放洛谷有人看,就搬过来了。本题解提供一个\(O(qn)\)的做法(实际上是暴力的优化)。先考虑暴力求解。对于每个操作,要求代价\(W\times(\sum_{i\inX}^{i}w[i]\times......
  • luogu 将会臭名昭著(
    ......
  • Luogu P4139 上帝与集合的正确用法
    \(\large{题目链接}\)\(\\\)首先介绍一下欧拉定理:\[a^{\varphi(p)}\equiv1\pmod{p},\gcd(a,p)=1\]\(\\\)所以费马小定理其实是欧拉定理的一种特殊情况,即\(p\)为质数......
  • Luogu P3674 小清新人渣的本愿 题解
    P3674小清新人渣的本愿lxl大爷的题,%%%%%以及CSPrp++!!!前言:其实是这题的名字吸引了我,毕竟人渣的本愿里的角色我觉得多多少少都沾点,哪来的小清新啊。《人渣的本愿》,又名......