解题思路:
        计数问题 这道题 使用动态规划最方便简洁高效,以下是动态规划的思路。

        假设d[k][i] 表示以i为起点,长度为k的路径(不经过自身)。

        此题K不大,只有3,所以 我们可以将k分类讨论(更易懂)

        则 d[0][i]=1

            d[1][i]=|G[i]|   //G[i]是i的邻接表

            d[2][i]+=d[1][j]-d[0][i] =d[1][j]-1 ; //j属于{G[i]}, 这里-d[0][i]就是去除1->2->1这种情况

            d[3][i]+=d[2][j]-d[1][i]+1 ; // 这里 -d[1][i] 去除 1->2->1->x 这种情况,但这样会多减一个1->2->1->2 这样的情况(k=2时,计算d[2][i]时保证了不会出现2->1->2),所以要+1;

注意事项:

    AC截图
    QQ截图20181220164742.png参考代码(只提供核心代码):

#define _for(i,a,b) for(int i=a;i<b;i++)

    _for(i,0,n)d[1][i]=G[i].size();//路径长度为1的时候
    _for(i,0,n){
        int len=G[i].size();
        _for(k,0,len){
            int j=G[i][k];
            d[2][i]+= d[1][j]-1; //路径长度为2的时候
        }
    }
    _for(i,0,n){
        int len=G[i].size();
        _for(k,0,len){
            int j=G[i][k];
            d[3][i]+= d[2][j]-d[1][i]+1; //路径长度为3的时候
        }
    }


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论