classSolution { public: intclimbStairs(int n){ int first=0, second =1 ,sum = 1; for(int i=0;i<n;i++){ sum = first + second; first = second; second = sum; } return sum; } };
introb(vector<int> &nums)// optimized { if (nums.size() <= 0) return0; if (nums.size() == 1) return nums[0]; int first = nums[0], second = max(nums[0], nums[1]); int res = second; for (int i = 2; i < nums.size(); i++) // 3+ house, dp { res = max(first + nums[i], second); first = second; second = res; } return res; }
资源型动态规划
这类问题通常是在给定资源限定范围里,获取最大的收益.
最经典的就是背包问题,其他的资源型 dp 问题基本是背包问题的延伸.
背包问题
背包问题分为 01 背包,完全背包,多重背包 (这个很少用到,不用学)
01 背包问题就是
有 N 件物品和一个最多能被重量为 W 的背包。第 i 件物品的重量是 weight [i],得到的价值是 value [i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
分析:
可见,在传统背包问题上,这题把原本的容量资源扩展到了二维:时间和精力。价值仍不变.
因此,我们同样先找递推式.
假设 dp 数组为 dp[i][t][h]. i 代表前 i 个物品,t 代表最大时间 t 范围. h 代表最大精力.
因此,我们分解子问题,要找到 i 个物品范围内的最优解,我们只需要判断 max((前i-1个, 不取第i个), (前i-1个, 取第i个)) 即可.
因此,递推式为 max(dp[i-1][t][h], dp[i-1][t-ti][h-hi] + vi). 其中 ti 和 hi 为第 i 个物品的消耗. vi 为第 i 个物品的价值.
intmain() { int n, t, h; cin >> n >> t >> h; // int arr[n][3]; // time, effort, happiness event *arr = new event[n]; for (int i = 0; i < n; i++) { cin >> arr[i].time >> arr[i].effort >> arr[i].happiness; }