题目:https://www.luogu.org/problemnew/show/P3953 因为K只有50,所以想到用dp[ cr ][ j ]表示在点cr.比最短路多走了 j 的方案数.(看了TJ才知道) 因为不是DAG,所以没有拓扑序,就用记忆化搜索就好了. 判0环可以用bool数组,而且是栈的样子,表示从自己出发又一模一样地走回来就说明有0环. 0环还要在一条合法路径上才行.判断是dis[cr]+k+dit[cr]<=dis[n]+K.(dit是从n到各点的最短路)还可以用它剪枝. #i…
题目描述: 策策同学特别喜欢逛公园.公园可以看成一张N个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会去逛公园,他总是从1号点进去,从N号点出来. 策策喜欢新鲜的事物,它不希望有两天逛公园的路线完全一样,同时策策还是一个 特别热爱学习的好孩子,它不希望每天在逛公园这件事上花费太多的时间.如果1号点 到N号点的最短路长为d,那么策策只会喜欢长度不超过d + K的路线. 策策同学想知道总共…
题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效性的话,可能在不同的时候调用这个值所产生的结果并不同. 因此一定要满足无后效性. 且记忆化搜索一定要用深搜,因为如果广搜的话,记忆化搜索就没有什么作用了.(因为广搜一定是先搜到最优结果) 再说滑雪这道题,可以用动态规划来做,当然也可以用记忆化搜索. 可以将dp数组当作记忆化搜索的数组 在记忆化搜索中…
题目:https://www.luogu.org/problemnew/show/P1192 题意: 给定n和k,一个人一次可以迈1~k步,问走n步有多少种方案. 思路: 本来傻乎乎上来就递归,显然会T的啊猪头! 然后改成记忆化搜索.dfs的参数就是还剩余的步数,num数组存的就是走i步的方案数. #include<stdio.h> #include<stdlib.h> #include<map> #include<set> #include<iost…
题目链接:https://www.luogu.org/problemnew/show/P1040 题意: 某一个二叉树的中序遍历是1~n,每个节点有一个分数(正整数). 二叉树的分数是左子树分数乘右子树分数加根节点分数,如果子树为空分数是1. 现在想知道这个二叉树最大的分数是多少,并且输出前序遍历结果. 思路: $f[i][j]$表示$i$~$j$号节点组成的子树的最大分数,为了最后能输出前序遍历结果用$root[i][j]$表示$i~j$号节点组成的子树的根 枚举根节点,记忆化搜索. //#i…
K<=50,感觉可以DP 先建反图求出从n到各个点的最短路,然后在正图上DP 设f[当前点][比最短路多走的距离]=方案数 转移显然是 $f[v][res]=\sum f[u][res+tmp]$  tmp是从v到u比最短路多走的路程 注意如果图中有0环,则有无穷多种方案. 判0环可以DFS判,也可以把最短路边和0权边建在一个新图上,用拓扑排序判(显然前者更简单) /*by SilverN*/ #include<iostream> #include<algorithm> #i…
题目链接:https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字 0 与 1 组成的n×n 格迷宫.若你位于一格0上,那么你可以移动到相邻 4 格中的某一格 1 上,同样若你位于一格1上,那么你可以移动到相邻 4 格中的某一格 0 上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入格式: 第 1 行为两个正整数n,m . 下面 n 行,每行 n 个字符,字符只可能是 0 或者 1 ,字符之间没有空格.…
这道题问的是石头剪刀布的的出题问题 首先不难看出这是个dp题 其次这道题的状态也很好确定,之前输赢与之后无关,确定三个状态:当前位置,当前手势,当前剩余次数,所以对于剪刀,要么出石头+1分用一次机会,要么不用机会然后也不加分 然后dp一下就行了,很简单的一道题 #include <bits/stdc++.h> #include <bits/extc++.h> using namespace std; #define limit (100000 + 5)//防止溢出 #define…
AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) memset(a,b,sizeof(a)) typedef long long ll; const int dx[4]={1,0,-1,0}; const int dy[4]={0,1,0,-1}; int vis[105][105], a[105][105]; int r, c; int f[105][105]; inline int read() { int…
题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA  因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 我们定一个f[u][k]数组为从当前节点u还剩时间k到达终点的方案 原来从u走到终点的最短路径消耗时间为dis[u] 而我们现在考虑走(u,v,w)这条边(不是最短路) 那么比走最短路需要多dis[v]+w-dis[u]的时间 所以f[u][k]=∑f[v][k-(dis[v]+w-dis[u])]…