题意分析:
题目意思是在邻接矩阵中判断图的连通性,不解释
用的Floyd
1 |
|
题意分析:
题目意思是在邻接矩阵中判断图的连通性,不解释
用的Floyd
1 | #include <stdio.h> |
搜索题,这题就是数据量大,其他没什么,BFS时记录转折就好了
用BFS做的,10000MS TLE了N次直接亮瞎。。。
最后面发现BFS四个方向的顺序也有关系(改下就AC了)
TLE时:1
2int iPlus[4] = {-1,0,0,1};
int jPlus[4] = {0,-1,1,0};
改成下面的就AC了:1
2int iPlus[4] = {-1,0,1,0};
int jPlus[4] = {0,-1,0,1};
1 | #include <stdio.h> |
起初以为这题是用Floyd算法,便起手尝试着做,Floyd的路径保存和输出又不懂,结果一直WA。。
后面才知道原来只要简单的DP就可以求出最长(兴趣点最高)路径,需要注意的还是路径的输出,DP时用pre[x]保存访问顶点x时的前驱,这样就OK了。
1 | if(map[j][i]!=-1&&dp[j] + map[j][i] > dp[i]) //状态转移要判断从j到i是否可以走通 |
1 | #include <stdio.h> |
二维完全背包吧,我的思路是这样的:
minp[i][j]
表示玩家杀死j只怪物取得经验值i 减少的最小疲劳度
状态转移方程: minp[i][j] =
MIN(minp[i][j],minp[i-monsters[k].Exp][j-1]+monsters[k].T)
这边需要注意的问题: 初始状态只有minp[0][0]=0 其他为一个无穷大的数,这边也可以定义INF为200
特别要注意的情况是可以杀死怪物取得经验值i大于升级所需的经验LiftUp,此时有可能牺牲的疲劳度是较小的(一开始考虑成每次升级都是获得刚好的经验值WA了几次)是较优的,所有i的变化范围应该是从monsters[k].Exp 到 LiftUp+monsters[k].Exp
每次状态转移后要增加判定条件
1 | if ( i> LiftUp && minp[LiftUp][j] >___minp[i][j]) |
最后从 minp[LiftUp][j] ( 1<= j <= 最多杀怪数) 找出最小值就是升级所需要的最小疲劳度
1 | #include <stdio.h> |
思路:
depots[i][j] 表示i个供应站j个饭馆的最优值
cost[i][j] 表示 从i到j建立一个供应站后的耗费(可以得知供应站必定建在中位数处:下标为(i+j)/2)
状态方程:
depots[i][j] = MIN(depots[i][j],depots[i-1][m]+cost[m+1][j])
在m处建立i-1个供应站,在m到j处建立一个供应站,找出最小值
这边m的范围要注意 i-1<=m<j 建立一个供应站先确定depots的初始条件
1 | #include <stdio.h> |
(其实还是用LCS的方法就可以了,考虑了好久,起初在数据输入地方就搞错了 T_T)
Max_Score[i][j]: 当第i颗子弹对付第j个恐怖分子的最大得分
1 | #include <stdio.h> |
背包问题,考虑是先计算出总量的一半,然后判断能否把这个背包装满。
觉得这题自己有点乱搞,虽然用下面的算法把它AC了,可能是数据太弱了,觉得这个算法还是有点问题。
PE了一次,原来是每组数据后都要一个n.
1 | #include <stdio.h> |
完全背包。
1 | #include <stdio.h> |
经典DP题目,就是求最长上升子序列的和!
1 | #include <stdio.h> |
1 | #include <stdio.h> |