动态规划
ocean_62
一只奋战在OI路上的小小蒟蒻,怀揣着一个大大的梦想 0.0
展开
-
洛谷P1006 传纸条
这是一道四维DP题,注意数组要开得恰好,不然会爆内存。(维数越高,每一维上的数字大1的空间代价就越大)因为有限制条件每个数只能访问一次,所以要判断两个人是否走到了同一个格,以及他们上一步是否在同一个格。如果两个人走到了同一个格,就跳过这次循环;如果两个人上一步在同一个格,就跳过这种情况,不再比较。动态转移方程:f[i][j][p][q] = max( f[i-1][j][p-1][q],原创 2016-10-23 18:13:05 · 947 阅读 · 0 评论 -
洛谷P1854 橱窗布置
1.此题的数据中有负数,所以dp数组的初始化为-inf!2.用book数组存储路径,用递归来回溯路径。(book[x][y]表示第x轮、选到第y个花瓶时最大方案的前一个点)f[x][y]:前x束花、前y个花瓶的最大美学值初始化:f[0][0~v] = 0状态转移方程:f[i][j] = f[i-1][k] + a[i][j] (i-1 #includ原创 2017-01-21 19:18:08 · 239 阅读 · 0 评论 -
洛谷P2066 机器分配
(一)此题数据范围很小,所以可用搜索。用b数组记录每次的路径,最后到达终点并比较,如果结果更大,则用c数组更新路径。#include#includeusing namespace std;int n,m,a[20][20],ans,b[20],c[20];void dfs(int x,int y,int z) { if (x == n+1) { if (z原创 2017-01-21 19:58:30 · 304 阅读 · 0 评论 -
洛谷P1541 乌龟棋
首先想到状态:f[x][a][b][c][d],表示已用a张一步卡、b张两步卡、c张三步卡、d张四步卡、走到第x格的最大得分。但五维dp容易超空间又容易超时,所以试着对状态进行优化。我们发现,x用于计算每格的得分;而已知a, b, c, d时,x可求得,所以可以省掉第一维状态。 x = 1+ 1*a + 2*b + 3*c + 4*d (注意此处的1)状态:f[a][b][c][d]原创 2017-01-22 20:26:39 · 356 阅读 · 0 评论 -
洛谷P1880 石子合并
#include#include#define inf 99999999using namespace std;int n,s[201],dpmax[202][202],dpmin[202][202];int main(){ scanf("%d",&n); for (int i=1; i<=n; i++) scanf("%d",&s[i]); for (int i=1; i<原创 2017-01-22 20:58:06 · 233 阅读 · 0 评论