
动态规划
各种DP
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
背包问题
01背包 Model: 给定n个物品,第i个物品的体积为Vi,价值为Wi.背包容积为m。每件物品最多选择一次,总体积不超过m,要求总价值最大。 01背包,时间复杂度 O(nm),空间复杂度 O(nm) #include<stdio.h> #include<iostream> #include<cmath> #include<math.h> #inc...原创 2020-02-10 20:23:44 · 231 阅读 · 0 评论 -
LeetCode 124. 二叉树中的最大路径和 (树形DP、递归实现)
二叉树中的最大路径和 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int ans = INT_MIN;原创 2020-06-21 04:04:18 · 235 阅读 · 0 评论 -
UVA-1347Tour——巧妙的状态设计与转移
Tour 刘老师的讲解就不重复了 DP方程为: d(i,j)=min(d(i+1,j)+dis(i+1,i),d(i+1,i)+dis(j,i+1))d(i,j) = min(d(i+1,j)+dis(i+1,i),d(i+1,i)+dis(j,i+1))d(i,j)=min(d(i+1,j)+dis(i+1,i),d(i+1,i)+dis(j,i+1)) 边界: d(n−1,j)=dis(n−1...原创 2020-03-04 00:59:35 · 178 阅读 · 0 评论 -
UVA-12563劲歌金曲——双重优先条件+变形01背包
劲歌金曲 题意: 两个优化: ①唱歌次数最大 ②时间最长 以①为首选条件 01背包模型,歌曲就是物品,时长就是体积,每首歌唱或不唱就对应物品的选或不选。 核心代码: 状态: num[i],表示时长为i时的唱歌数量最大值; d[i]表示时长为i最长的唱歌时间。 优先更新num[],如果num可以更新,那么d[]必须同时更新 for(int i=1;i<=n;i++) ...原创 2020-02-29 23:39:39 · 266 阅读 · 0 评论 -
UVA - 116多段图的最短路
Unidirectional TSP 本题的最短路与“数字三角形问题”的思路是极其相似的,最后一列为底层状态,从最后一列一列一列的向前更新。 主要是路径记录(尤其要求是字典序),再用一个数组path[][]记录下父节点,最后循环输出。 #include<stdio.h> #include<iostream> #include<cmath> #include&l...原创 2020-02-29 20:12:15 · 188 阅读 · 0 评论 -
POJ - 1742-Coins多重背包的可行性问题+二进制拆分优化
Coins 在这个背包模型里面,没有”物品价值“这个属性,不是最优解问题,而是可行性问题。 用多重背包的变形即可。 bool f[maxn]; f[0]=1; for(int i=1;i<=n;i++) for(int j=1;j<=c[i];j++) for(int k =m...原创 2020-02-27 13:21:25 · 283 阅读 · 0 评论 -
HDU1003 Max Sum(最大子串和)& HDU1024 Max Sum Plus Plus
#Max Sum Description: 一个数字序列,求max(∑k=ijk2,1<=i<=j<=n){{max(\sum_{k=i}^j k^2,1<=i<=j<=n)}}max(∑k=ijk2,1<=i<=j<=n) 状态:dp[i],前i个数,以第i个数结尾的子串的和的最大值,之所以必须要求以第i个数结尾,是因为子串要求数字必须连续...原创 2020-02-11 21:30:03 · 285 阅读 · 0 评论