ACM-动态规划
文章平均质量分 58
Kang_TJU
Talk is cheap!
展开
-
动态规划基础
本文来自于《算法导论》第二版第十五章动态规划部分的读书笔记。理论部分动态规划技术所适用的问题是什么? Dynamic Programming typically applies to optimization problems in which a set of choices must be made in order to arrive at an optimal solution.原创 2016-10-30 16:08:10 · 450 阅读 · 0 评论 -
leetcode-70-Climbing Stairs
问题题目:[Climbing Stairs]思路DP,斐波那契数列是转移方程。代码class Solution {public: int climbStairs(int n) { if(1==n) return 1; else if(2==n) return 2; else{ int f1 = 1;原创 2017-02-20 17:38:29 · 411 阅读 · 0 评论 -
leetcode-5-Longest Palindromic Substring 动态规划
问题题目:[leetcode-5]思路朴素的思路,暴力法。但是考虑从较长的串开始枚举。不过还是TLE.代码/*这次我还是暴力,但是从大串向小串枚举。之前的枚举思路导致TLE,这次的可能也导致。试试吧。*/class Solution {public: string longestPalindrome(string s) { int sz = s.size();原创 2016-12-28 12:39:18 · 961 阅读 · 0 评论 -
leetcode-53-Maximum Subarray 动态规划
问题题目:[Maximum Subarray]思路最关键的是状态定义,dp[i]应该表示包含a[i]的最大连续长度,只要之前状态的是负值,那么当前子状态累加之后,不会大于当前状态本省作为dp[i]的值。状态定义 dp[i]表示包含a[i]的最大连续子串长度dp[i]表示包含a[i]的最大连续子串长度转移函数 dp[i]=max(dp[i−1]+a[i],a[i])(1) dp[i] = ma原创 2016-11-03 22:09:55 · 531 阅读 · 0 评论 -
leetcode-121-Best Time to Buy and Sell Stock
问题题目:[leetcode-121]思路蛮力法,计算所有可能的情形。O(N2)O(N^2)的复杂度。代码(TLE)class Solutiocn {public: int maxProfit(vector<int>& prices) { int sz = prices.size(); if(!sz) return 0; int ans = 0原创 2017-02-14 13:57:25 · 327 阅读 · 0 评论 -
2016校招编程 lcs 动态规划
问题题目:[最长公共子序列]思路[参考这一篇]代码class LCS {public: int findLCS(string A, int n, string B, int m) { // write code here if( !n || !m ) return 0; std::vector< std::vector<i原创 2016-12-06 20:40:38 · 377 阅读 · 0 评论 -
面试常考算法题(九)-最长公共字串
问题思路代码原创 2017-02-14 21:34:02 · 481 阅读 · 0 评论 -
剑指offer-变态跳青蛙-DP
问题题目:[变态跳青蛙]思路和之前分析思路一样。记F[N]为调到第N层的方法。 对于第N-1层,可以1步跳过来。此时有F[n-1]种方法。 对于第N-2层,可以2步跳过来,此时有F[n-2]种方法。 … 对于第1层而言,可以N-1步跳过来,此时有F[1]种方法。 对于第0层而言,可以N步跳过来,此时有1种方法代码class Solution {public: int jumpFl原创 2017-02-11 15:22:17 · 408 阅读 · 0 评论 -
leetcode-120-Triangle 动态规划
问题题目:[leetcode-120]思路代码代码//c versionint minimumTotal(int** triangle, int triangleRowSize, int *triangleColSizes){ int** dp = (int**)malloc( sizeof(int*) * triangleRowSize ); if( !dp ) r原创 2016-11-03 20:29:23 · 548 阅读 · 0 评论 -
交错01串-网易2018校招内推
问题题目:[交错01串]思路这个题我做的时候,很自然的就想到dp的思路。也没什么方法论指导我,感觉和之前做的最长连续子串类似。用了类似的方法。代码#include <iostream>#include <vector>int main( void ){ std::string s; while( std::cin >> s ){ int sz = s.size()原创 2017-08-15 19:35:38 · 388 阅读 · 0 评论 -
剑指offer-斐波那契数列-DP
问题题目:[斐波那契数列]思路递推。代码class Solution {public: int Fibonacci(int n) { if(!n) return 0; else if(1==n) return 1; else{ int f1 = 0; int f2 = 1;原创 2017-02-11 13:14:30 · 368 阅读 · 0 评论 -
剑指offer-跳台阶-DP
问题题目:[跳台阶]思路初值为1,1 建模后的到,N阶楼梯的走法: F[N]=F[N−1]+F[N−2](1)F[N] = F[N-1] + F[N-2] \tag{1}代码class Solution {public: int jumpFloor(int number) { if(1==number) return 1; int f1 = 1;原创 2017-02-11 15:04:16 · 308 阅读 · 0 评论 -
合唱队形(LIS) 动态规划
问题题目:[百练-2711]思路动态规划最重要的是第一步和第二步,也就是说一定要定义到合适的状态。并且找到状态转移的函数。这个题目如果只看一边,那就是一个LIS题目,所以问题在于怎么样结合LIS解题。本题本质是求最长的合唱队形,不妨考虑如下的状态定义。设dp_inc[i]代表以第i个位置的元素结尾的LIS,dp_dec[i]代表以第i个位置的元素开始的LDS。那么对于第i个位置的元素来说,dp_in原创 2016-11-29 11:04:55 · 530 阅读 · 0 评论 -
错排公式-计数
问题题目:[不容易系列之一]思路本质是计数的题目。拿到也是没有直接的思路。考虑DP的思路进行分析。分析第i个状态和之前状态的关系。不妨先直观的理解:假如现在N-1个数错排,那么加入第N个数之后,将第i(1<=i<=N-1)个数字放到第N个位置上,然后把第N个数放到第i个位置上,则前N个数字依然保持错排的特性。这是一种情形,一共有(N-1)*F(N-1)种。其中F(N-1)表示前N-1个数错排的个数。原创 2016-11-23 15:15:07 · 620 阅读 · 0 评论 -
N阶楼梯-计数
问题题目:[N阶楼梯]思路本质应该是计数的方法。但是具体分析的时候,比较像DP。分析第N个状态,然后判断其与之前状态的关系。 显然,想要到达第N个状态,有两种办法。N-1阶时,走一步。N-2阶时,走两步。 完成一件事的N个步骤是乘法关系,多种方法是加法关系。设F[i]表示第i层楼梯的方法,所以有: F[N]=F[N−1]∗1+F[N−2]∗1(1)F[N] = F[N-1]*1 + F[N原创 2016-11-23 14:36:54 · 486 阅读 · 0 评论 -
leetcode-300-Longest Increasing Subsequence 动态规划
问题题目:[leetcode-300]思路参照此前另一篇文章[最长递增子序列(LIS)-动态规划]代码int lengthOfLIS(int* nums, int numsSize) { if( NULL == nums || numsSize <= 0 ) return 0; int* dp = (int*)malloc( sizeof(int) * numsSize原创 2016-11-29 15:38:54 · 367 阅读 · 0 评论 -
最长递增子序列(LIS)-动态规划
问题题目:[拦截导弹]思路这个题目的本质是最长递增子序列。首先给出序列的定义,要区别子串。 在一个已知序列:{x1,x2,...xn}\left\{ x_{1},x_{2},...x_{n} \right\}当中,取出若干数组成新的序列{xi1,xi2,...xim}\left\{ x_{i1},x_{i2},...x_{im} \right\}。其中下标,i1,i2,...imi1,i2,...原创 2016-11-23 16:03:09 · 570 阅读 · 0 评论 -
最长公共子序列(longest common subsequence) 动态规划
问题题目:[Common Subsequence]思路代码#include <iostream>#include <vector>#include <string>#include <algorithm>int cal_lcs( const std::string& X, const std::string Y );int main(){ std::string s1; s原创 2016-11-29 22:31:15 · 661 阅读 · 0 评论 -
leetcode-64-Minimum Path Sum 动态规划
问题题目:[leetcode-64]思路代码int minPathSum(int** grid, int gridRowSize, int gridColSize) { if(!grid || gridRowSize < 0 || gridColSize < 0) return -1; int** dp = (int*)malloc( gridRowSize * siz原创 2016-11-30 14:01:14 · 466 阅读 · 0 评论 -
背包系列
本文主要总结我对背包问题学习的心得,主要是把我以前在印象笔记中的内容搬了过来。基本概念先给出常见的背包情形: 01背包(ZeroOnePack): 有N件物品和一个容量为V的背包。(每种物品均只有一件)第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 完全背包(CompletePack): 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物原创 2017-02-19 20:19:36 · 304 阅读 · 0 评论 -
DAG模型的动态规划学习
问题题目:[nyoj-16]思路代码(dfs-TLE)#include <iostream>#include <fstream>#include <vector>#include <algorithm>//#define LOCALstruct Rec{ int a_; int b_; Rec( int a = 0, int b = 0 ) : a_(a), b_(原创 2017-01-19 16:06:33 · 2385 阅读 · 0 评论 -
背包问题汇总
问题思路小心下标对应不一致带来的问题。小心。zero_one_pack(v[i],c[i]) for j = M to c[i] f[j] = max( f[j-c[i]]+v[i] , f[j] )f[0......M] = 0; // 初始化第0行,即一个物品都没有的情形。J一定要包括0.这是关键。for i = 1 to N zero_one_pack原创 2017-02-19 22:33:03 · 511 阅读 · 0 评论