题目链接
B
思路
很明显的一道背包题目,首先对游戏平台做0,1背包,然后再游戏平台里得游戏做条件背包。
dp[i][j]表示前i个游戏平台j钱得最大贡献
首先针对游戏平台,先处理dp[i][j]=dp[i][j-pi];
然后再游戏平台中dp[i][j]=max(dp[i][j],dp[i][j-cost]+val)
最后再更新dp[i][j]=max(dp[i][j],dp[i-1][j]);
代码实现
1 |
|
C
思路
这道题可以bfs,但是这里介绍一种传递闭包得做法,就是先判断1-9中每个数能变成得数有几个。
然后答案就等于n每个位数上得数相乘。可以用floyd传递闭包。
代码实现
1 |
|
D
思路
拓扑排序,首先,单向边入列,并且入度加,双向边不加入读。
然后拓扑排序的时候,每次把入读为0的点所连接的边删除,然后与这个点所连接的双向边,方向为该点发散。
如果一开始就存在环,那么这个环不可能入列,所以最后判断是否存在没有访问过的点来确定是否存在环
代码实现
1 |
|
G
思路
首先,要从后面往前面扫一遍,扫出每个节点的最小速度。因为如果当前节点速度太大,后面可能刹不住车
然后增加两个点,一个是第一个点,长度为0,速度为1,第二个是最后一个点长度为len,速度为max。
每次计算两个点之间的最大速度,可以列出一个方程
设$v_0$为起始速度,$v_1$为结束速度,x为加速的距离,y为减速的距离那么
可以求出
那么最大速度就等于$v_0+x$
代码实现
1 |
|
H
思路
一道简单的dp题目
dp[i][j]=dp[i-1][j]+dp[i][j-1];
如果马占领了该格子,则dp[i][j]=0;
代码实现
1 |
|
K
思路
这道题,发现N很小,所以我们考虑用floyd。
floyd的最外层循环枚举的是经过k个点时dis[i][j],i与j之间的最短路,那么我们可以先排序。
这样经过的k点最能够从小到大,所以当前的k点就是最大的点。
代码实现
1 |
|