随笔分类 - DP
摘要:/*摘自网络因为必须经过H个点,H<=15,安排一个顺序使得能遍历完H个城市,可以用状态DP做。用Floyd求任意两点之间的最短距离,也就是最小路费。状态DP求经过某些城市集合s,最后到达某个城市i获得的最大收益,用f[s][i]表示。最后要回到起始点1,这样判断是否能从f[all][i]状态是否能回到1点即可,all是所有的必经点。PS:比赛的时候不是这么想,比赛时是把回到起始点1虚拟成n+1点...
阅读全文
摘要:题意:很简单,不废话了- -在这道题中单调队列的作用:在线性时间内维护定长区间的最值。单调队列没学过的话去学一下这题吧转移的时候dp[i][k]->dp[i+1][j],k与j的差距不超过T,分两种情况转移,k在j的左边和右边,所以维护T长度的最值,双向扫一遍就OK了 (从右边扫过来) k j j k<--------T-------> <--------T-------> dp[i+j][...
阅读全文
摘要:题意: 给定每天的股票买进上限,买进价格,卖出上限,卖出价格,每两次买卖操作中间必须间隔w天,每天最多持有maxp个股票,问n天后最大收益是多少题解: DP方程显然: dp[i][j]=max(不买不卖,买入操作,卖出操作)不买不卖 dp[i][j]=max(dp[i][j],dp[i-1][j])买 dp[i][j]=max(dp[pre][k]-(j-k)*AP[i]) dp[i][j]+j*...
阅读全文
摘要:注:http://poj.org/problem?id=3278为此题的缩水版 BFS能过思路:Step1:将数转换为二进制Step2:因为有-1的操作 所以不能直接贪心 通过观察可得 b是a的二进制前缀与b是二进制的前缀+1同样重要 考虑 dp[位数][状态] (状态为前缀 和前缀+1)Step3:建立初值 dp[i][j]=abs(a-toBase10(b的前i+1位))Step4: if(b的二进制表示第i位==0) dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+2)dp[i][1]=min(dp[i-1][0]+2,dp[i-1][1]+2)elsedp[i
阅读全文
摘要:思路:先BFS出关键点(起点,电池,开关)之间的最短路然后状态压缩DP dp[当前位置][状态]=电池电量二分答案即可#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>using namespace std;const int N=16;#define for if(0); else forstruct Point{ int x,y; Point(){x=y=0;} Point(int xx,int y
阅读全文

浙公网安备 33010602011771号