码迷,mamicode.com
首页 > 其他好文 > 详细

HNOI2002 公交车路线

时间:2018-02-13 18:53:54      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:www   重复   去重复   lin   ref   状态转移方程   markdown   cpp   return   

Luogu

很水的DP

\(E\)丢掉,就可以发现原来的环变成了一个以\(A\)为中点,两边对称的链。

这个时候\(B\)\(H\)的答案是一样的,\(G\)\(C\)是一样的,\(F\)\(D\)是一样的。

那么我们就没有必要再去重复的求答案,原来的\(8\)个点被压成了\(4\)个点。

\(dp[x,y]\)为从\(A\)点到\(y\)点路程为\(x\)的方案总数。

状态转移方程为

\[dp[x,y]=dp[x-1,y-1]+dp[x-1,y+1]\]

\[dp[0,1]=1\]

记得转移的时候要此时是否是链的边界

再用滚动数组优化即可

PS:这题该怎么矩阵快速幂啊 如有dalao了解请私信小蒟蒻

#include <cstdio>

const int mod = 1e3;

int N;
int dp[2][5];

int main()
{
    scanf("%d", &N);
    dp[0][1] = 1;
    for(int i = 1, pos = 1; i <= N; ++i, pos ^= 1)
        for(int j = 1; j <= 4; ++j)
            dp[pos][j] = (dp[pos ^ 1][(j == 1) ? 2 : j - 1] + dp[pos ^ 1][(j == 4) ? 0 : j + 1]) % mod;
    printf("%d\n", (dp[(N & 1) ^ 1][4] << 1) % mod);
    return 0; 
}

HNOI2002 公交车路线

标签:www   重复   去重复   lin   ref   状态转移方程   markdown   cpp   return   

原文地址:https://www.cnblogs.com/zcdhj/p/8447030.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!