HDU2157How many ways??(DP)

题目大意:给你一张道路情况的无权有向图,请你找出从a到b中途经过k个旅游景点的道路方案数,并且结果要模除1000。

解题思路:本题之前有做过一个类似的,只不过所求的解不同,那题是求最短路。这题则是用DP,设状态dp[k][j]表示从起点到达j位置,并且中途经过k个旅游景点的方案数,则状态转移方程:dp[k][z]=(dp[k][z]+dp[k-1][j])%1000,解释:从起点到达终点如果可以直接到达就为1,这里要初始化边界dp[0][b]=1,表示不用经过任何景点就能到达,状态转移就是从中插1个,然后2个,然后...最终到达最优解。并且在写转移方程要注意的点是:当起点j和终点z连通,才能够增加方法数,类似于分步乘法的组合数原理,每次多一种路的情况把之前的方法数加上来。(好吧我也不知道在讲啥了,思路有点乱,看代码吧,我想说得是你要知道终点和起点方法数的转移这点就对了)这里之前写有个bug,想当然地想打表减少复杂度,但是始终不知道在起点不同的情况下怎么处理,然后就英勇的gg了。

AC代码如下:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=21;

int dp[maxn][maxn],map[maxn][maxn];

int main()
{
    int i,j,s,z,a,b,k,n,m;
    while(~scanf("%d%d",&n,&m) && n+m)
    {
        memset(map,0,sizeof(map));
        //无向图构建
        for(i=0;i<m;i++)
        {
            cin>>a>>b;
            map[a+1][b+1]=1;
        }
        cin>>s;
        while(s--)
        {
            memset(dp,0,sizeof(dp));
            scanf("%d%d%d",&a,&b,&k);
            dp[0][a+1]=1;
            for(i=1;i<=k;i++)
            {
                for(j=1;j<=n;j++)
                    for(z=1;z<=n;z++)
                        if(map[j][z])
                        {
                            dp[i][z]=(dp[i-1][j]+dp[i][z])%1000;
                        }
            }
            cout<<dp[k][b+1]<<endl;
        }
    }
    return 0;
}

好像网上的题解大多是矩阵快速幂的解法QAQ
全部评论

相关推荐

06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务