一、动态规划专题
1205 N阶楼梯上楼问题 dp[i]表示到达i阶的方法数,状态转移方程:dp[i] = dp[i-1]+dp[i-2],值很大要用long long.
1451 不容易系列之一 dp[i]表示总共i个数时的错排方案数,状态转移方程:dp[i] = (i - 1) * dp[i-1] + (i - 2) * dp[i-2];
1420 Jobdu MM分水果 01背包变形。dp[i]表示可以达到容量为i的状态,状态转移方程:if (dp[i] == true) dp[i+weight[k]] = true;(k=1,2...n),初始化:dp[0] = true,其余皆为false
1209 最小邮票数 01背包变形。dp[i]表示达到邮资i所需的最少的邮票数,状态转移方程:if (dp[i] != MAX) dp[i+Value[k]] = min[dp[i+Value[k]),dp[i]+1)(k=1,2,3..n)初始化:dp[0]=0,其余MAX。
1358 陈博的平均主义 01背包变形。将A~B之间的数i各个数位当做一个物品,问题就转换了,解法同1420 Jobdu MM分水果。
1025 最大报销额 01背包变形。本题的关键是每张发票限额1000.00,先忽视小数点,看成100000,最多30张,那么总限额30*100000=300W,也就是说背包容量是300W,之后就是背包问题了。最坏情况下需要操作30*300W=9000W次。没错,就是这么操蛋,敢敲就会赢!
1030 毕业bg 01背包+贪心。先对各个BG按结束时间非降排序,然后用背包做。题目没说明时间大小,一开始以为用背包做不妥,因为考虑到背包容量未知,但是要这作为机试的题目,若非压轴题,肯定不难的,这个是考场上应该利用到的信息。
1042 Coincidence 裸裸的最长公共子序列
1452 搬寝室 贪心+DP。dp[i][j][0]表示在前面i个物品中搬了j对物品,第i个物品不搬动所消耗的体力,dp[i][j][1] 表示在前面i个物品中搬了j对物品,第i个物品要搬动所消耗的体力。我们要使最终消耗的体力最小,那么一个物品只会与重量相近的两个物品之一一起搬走,所以先对重量排序,也就是贪心。之后就是状态转移方程:Dp[i][j][0] = min(Dp[i-1][j][1],Dp[i-1][j][0]);Dp[i][j][1] = min(Dp[i][j][1],Dp[i-1][j-1][0]+Temp)。最终输出min(dp[n][k][0],dp[n][k][1])。
1453 Greedy Tino dp[i][j]=true表示可以到达扁担一边承重i一边承重j的状态,dp[i][j]=false表示不可达。状态转移方程:if (j >=Weighe[i] && dp[j-Weight[i]][k] == true) dp[j][k] = true;
if (k >=Weighe[i] && dp[j][k-Weighe[i]] == true) dp[j][k] = true。最后选dp[j][j]=true中最大的j。
1082 代理服务器 一道亮瞎狗眼的DP。需要先转换模型,利用map将n个代理服务器IP和m个服务器IP映射成ID,然后问题就变成为m个服务器IP的ID X匹配一个不为X的代理服务器IP的ID Y,如果前后两个Y相同那么无须切换,否则需要切换。dp[i][j]表示第i个服务器匹配第j个代理服务器所需要的最少切换次数。状态转移方程:Dp[i][j] = min(Dp[i][j],Dp[i-1][j])还有j!=k时 Dp[i][j] =min(Dp[i][j],Dp[i-1][k]+1);
1533 最长上升子序列 必须用复杂度O(nlogn)的解法。Dp[i]表示长度为i的子序列中末尾最小的数,状态更新必须用二分查找。具体见代码:
for (i = 2; i <= n; ++i) {
int low = 1,high = dLen;
while (low <= high) {
int mid = (low + high) / 2;
if (Arr[i] > Dp[mid]) low = mid + 1;
else high = mid - 1;
}
if (low > dLen) {
dLen++;
Dp[dLen] = Arr[i];
}
else Dp[low] = Arr[i];
}
二、数据结构专题
1415 不一样的循环队列 循环队列。关键是用一个Flag标志head==tail时是空还是满。
三、未解题