解题思路:
计数问题 这道题 使用动态规划最方便简洁高效,以下是动态规划的思路。
假设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截图
参考代码(只提供核心代码):
#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分
1 人评分
分糖果 (C++代码)浏览:933 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:741 |
C语言训练-最大数问题 (C语言代码).........关于-1浏览:762 |
C二级辅导-进制转换 (C语言代码)浏览:551 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:590 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:1067 |
妹子杀手的故事 (C语言代码)浏览:737 |
字符逆序 (C语言代码)浏览:506 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:1100 |
数组与指针的问题浏览:760 |