九度Oj题解

一、动态规划专题

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时是空还是满。


三、未解题

1256

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值