动态规划
hebastast
这个作者很懒,什么都没留下…
展开
-
416. Partition Equal Subset Sum
public class Solution { public boolean canPartition(int[] nums) { int sum=0; for(int num:nums) { sum+=num; } if(sum%2==1) return false;原创 2017-02-08 15:56:43 · 320 阅读 · 0 评论 -
179. Largest Number
class Solution {public: static bool cmp(const string &a,const string &b) { return a+b>b+a; } string largestNumber(vector<int>& nums) { vector<string> snums; for原创 2016-10-10 10:45:50 · 217 阅读 · 0 评论 -
56. Merge Intervals
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */class Sol原创 2016-09-12 14:19:10 · 266 阅读 · 0 评论 -
77. Combinations
/* c(n,k)=c(n-1,k-1)+c(n-1,k)*/class Solution {public: vector<vector<int>> combine(int n, int k) { vector<vector<int>> result; if(k==n||k==0) {原创 2016-08-30 10:13:26 · 396 阅读 · 0 评论 -
167. Two Sum II - Input array is sorted
class Solution {public: int minPathSum(vector<vector<int>>& grid) { vector<vector<int>> dp(grid.size(),vector<int>(grid[0].size(),0)); dp[0][0]=grid[0][0]; for(int i=1;i<gr原创 2016-08-29 14:05:50 · 455 阅读 · 0 评论 -
89. Gray Code
class Solution {public: vector<int> grayCode(int n) { vector<int> result; result.push_back(0); for(int i=0;i<n;i++) { for(int j=result.size()-1;j>=0;j--原创 2016-08-28 16:18:49 · 408 阅读 · 0 评论 -
91. Decode Ways
class Solution {public: int numDecodings(string s) { vector<int> dp(s.length()+1);//dp[i]表示了s[i]到s[s.length()-1] 所能形成解码的方式的数目 int n=s.length(); if(n==0) return 0; d原创 2016-08-28 14:12:41 · 428 阅读 · 0 评论 -
97. Interleaving String
/*dp[i][j] 代表s3前i+j个字符 是否能够用s1的前 i个字符 和s2的前j个字符 表示i j 代表字符的个数 不是下标dp[0][0] =truedp[i][0]=(dp[i-1][0]&&s1[i-1]==s3[i-1])dp[0][j]=(dp[0][j-1]&&s2[j-1]==s3[j-1])dp[i][j]=(dp[i-1][j]&&s1[i-1]==s3[i+j-原创 2016-08-27 15:26:21 · 490 阅读 · 0 评论 -
115. Distinct Subsequences
/*使用动态规划来解决dp[i][j] 代表 s[0~j-1]中包含的t[0~i-1]的不同子字符串的个数dp[0][j]=1 代表空字符串是任意一个字符串的子串dp[i][0]=0 (i!=0) 任意一个非空字符串都不可能是空字符串的子集dp[i][j] if(s[j-1]!=t[i-1]) dp[i][j]=dp[i][j-1] if(s[j-1]==t[原创 2016-08-27 11:03:43 · 421 阅读 · 0 评论 -
85. Maximal Rectangle
/*程序逐行处理.先处理0行,最后处理m-1行在处理第j行的时候面积等于(right[i]-left[i])*height[i]left[i]=max(left[i],cur_left)right[i]=min(right[i],cur_right)if(matrix[j][i]=="1") height[i]+=1;else height[i]=0;*/clas原创 2016-07-19 16:28:04 · 375 阅读 · 0 评论 -
132. Palindrome Partitioning II
class Solution {private: vector<string> curlist; int mincut=INT_MAX; bool judge(string &s,int start,int end) { if(start==end) return true; while(end>start)原创 2016-07-29 11:09:22 · 285 阅读 · 0 评论 -
188. Best Time to Buy and Sell Stock IV
class Solution {private: int quicksolve(int days,vector<int>& prices) { int profit=0; for(int i=1;i<days;i++) { if(prices[i]>prices[i-1]) pr原创 2016-10-11 10:35:38 · 311 阅读 · 0 评论 -
198. House Robber
class Solution {public: int rob(vector<int>& nums) { int n=nums.size(); if(n==0) return 0; if(n==1) return nums[0]; vector<int> dp(n,0);//dp原创 2016-10-12 16:21:50 · 298 阅读 · 0 评论 -
209. Minimum Size Subarray Sum
class Solution {public: int minSubArrayLen(int s, vector<int>& nums) { int left=0; int right=0; int sum=0; int min_dis=INT_MAX; int n=nums.size(); w原创 2016-10-16 14:51:35 · 252 阅读 · 0 评论 -
413. Arithmetic Slices
class Solution {public: int numberOfArithmeticSlices(vector<int>& A) { int n=A.size(); if(n<3) return 0; vector<int> dp(n,0);//dp[i]表示以i结尾的等差数列的个数 if(A[原创 2017-02-07 13:48:03 · 262 阅读 · 0 评论 -
375. Guess Number Higher or Lower II
class Solution {public: int getMoneyAmount(int n) { vector<vector<int>> dp(n+1,vector<int>(n+1,0)); for(int i=2;i<=n;i++) { for(int j=i-1;j>=1;j--) {原创 2016-12-26 14:43:11 · 281 阅读 · 0 评论 -
368. Largest Divisible Subset
class Solution {public: vector<int> largestDivisibleSubset(vector<int>& nums) { vector<int> ret; if(nums.size()==0) return ret; int m=0; int mi=0;原创 2016-12-21 14:30:38 · 364 阅读 · 0 评论 -
363. Max Sum of Rectangle No Larger Than K
class Solution {public: int maxSumSubmatrix(vector<vector<int>>& matrix, int k) { int row=matrix.size(); if(row==0) return 0; int col=matrix[0].size();原创 2016-12-17 13:00:46 · 330 阅读 · 0 评论 -
309. Best Time to Buy and Sell Stock with Cooldown
int maxProfit(vector<int> &prices) { int buy(INT_MIN), sell(0), prev_sell(0), prev_buy; for (int price : prices) { prev_buy = buy; buy = max(prev_sell - price, buy); pre原创 2016-11-23 16:31:33 · 268 阅读 · 0 评论 -
300. Longest Increasing Subsequence
class Solution {private: int len=0; vector<int> d; int search(int i) { int left=1; int right=len; while(left<right) { int middle=left+(right原创 2016-11-17 14:33:00 · 225 阅读 · 0 评论 -
322. Coin Change
class Solution {public: int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount+1,INT_MAX); dp[0]=0; for(int i=1;i<=amount;i++) { for(aut原创 2016-11-29 12:04:44 · 291 阅读 · 0 评论 -
279. Perfect Squares
class Solution {public: int numSquares(int n) { if(n<=0) return 0; vector<int> dp(n+1,INT_MAX); dp[0]=0; for(int i=1;i<=n;i++) { int原创 2016-11-13 11:40:27 · 241 阅读 · 0 评论 -
House Robber II
class Solution {private: int robHelp(vector<int> & nums,int start,int end) { if(end-start+1==1) return nums[start]; if(end-start+1==2) return max(nums[s原创 2016-10-19 10:10:14 · 233 阅读 · 0 评论 -
152. Maximum Product Subarray
class Solution {public: int maxProduct(vector<int>& nums) { if(nums.size()==0) return 0; int minpre=1; int maxpre=1; int maxhere;//以a[i]结尾的乘积最大值 int minhere;//以a[i原创 2016-10-06 10:10:31 · 206 阅读 · 0 评论 -
53. Maximum Subarray
/*dp[i]代表nums数组中 从0~i的最大subarray的和,且必须包含i元素dp[i]=dp[i-1]>0?dp[i-1]:0+nums[i-1]*/class Solution {public: int maxSubArray(vector<int>& nums) { vector<int> dp(nums.size()+1); dp[0原创 2016-07-18 22:38:44 · 268 阅读 · 0 评论 -
123. Best Time to Buy and Sell Stock III
/*f[k][j]表示到j天为止进行了k次交易,产生的最大利润f[k][j]=max{f[k][j-1],price[j]-price[i]+f[k-1][i]} 0=<i<=j-1 =max{f[k][j-1],price[j]+max{f[k-1][i]-price[i]}} */class Solution {public: i原创 2016-07-18 10:48:23 · 333 阅读 · 0 评论 -
leetcode-Unique Binary Search Trees
题目的意思就是在有n个不相同元素的情况下 进行随机插入 组成一个BST 问有几种不相同的BST n=0 c[0]=1 空树 n=1 c[1]=1 只有一个节点的树 n=2 c[2]=c[0]*c[1]+c[1] *c[0]; 左子树有1个元素右子树有0个元素 左子树有0个元素 右子树有1个元素 n=3 c[3]=c[0]c[2]+c[1] c[1]+c[2] *c[0];左子树有0个原创 2015-11-21 15:58:56 · 413 阅读 · 0 评论 -
最大乘数
题目:给出N个1-9的数字 (v1,v2,…,vN),不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。并说明其具有优化子结构性质及子问题重叠性质。(20分) 例如: N=5, K=2,5个数字分别为1、2、3、4、5,可以加成: 1*2*(3+4+5)=24 1*(2+3)原创 2015-11-10 09:56:44 · 1439 阅读 · 0 评论 -
n个数 取任意个数相加求和的个数
// MicroSofrInterviewProblem2.cpp : Defines the entry point for the console application.//有若干个给定的数(都小于N),问从中任意取几个数相加,可以得到多少个不同的结果.//处理这种类似背包的时候,注意内层循环一定要memcpy重建一个副本,不然会陷入死循环并越界。如题,j = 0, 当0 + 1记录在re原创 2015-11-10 17:04:01 · 8001 阅读 · 0 评论 -
最大乘数
题目:给出N个1-9的数字(v1,v2,…,vN),不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。并说明其具有优化子结构性质及子问题重叠性质。(20分)例如: N=5, K=2,5个数字分别为1、2、3、4、5,可以加成:1*2*(3+4+5)=24 1*(2+3)*原创 2015-11-10 09:55:25 · 752 阅读 · 0 评论 -
最长上升子序列n*n和nlogn 算法
最长上升子序列是常见的DP问题.数组b[1]~b[n]中存放着n个数字, 从1~n都有,顺序不定。 第一种方法是n*n时间复杂度的算法,利用一个数组d[i](i从1到n)存放着以b[i]作为结尾的最长子序列的长度,则状态转换方程为: d[i]=max{d[j]+1},(jint n,b[n+1],d[n+1];//b[n+1]中存放原来的数组,d[n+1]中存放最长上升子序列的长度int p原创 2015-07-13 11:50:24 · 760 阅读 · 0 评论 -
Kruskal算法的并查集实现
最小生成树的kruskal算法的伪代码如下 w[i]为边的权值,u[i],v[i]分别为边的端点的下标 mst为最小生成树的所有边的结合 n为顶点的个数 m为边的个数将边按权值排序w[0]<=w[1]<=……..<=w[m-1]; 初始化每个顶点属于不同的连通分量; for(i=0;i#include <iostream>using namespace std;const int NMA原创 2015-07-19 21:33:11 · 1571 阅读 · 0 评论 -
codeforces 463c
//codeforces 463c //题目大意://在n*n的网格里每一个网格都有一个数字 在这个网格上放置2个主教//主教会攻击在和他同一个对角线上的数字 而每攻击一个数字就会获得//这个数字大小的钱 怎么放置两个主教 才可使两个主教不攻击同一个元素//并且获得最多的钱//解题思路://要想两个主教不攻击同一个元素 则两个主教必须在不同的奇偶格里(行号+列号)//计算每个格子上原创 2015-07-15 18:51:11 · 541 阅读 · 0 评论 -
uva_10201 adventure_in_moving dp
//uva_10201 adventure_in_moving //输入://1////500//100 999//150 888//200 777//300 999//400 1009//450 1019//500 1399//////1 为输入数据的次数 和500之间有空格 500为路径的长度//接下来7行 每行有2个数字 第一个数字表示加油站的位置 第二个数表示原创 2015-07-14 15:27:02 · 447 阅读 · 0 评论 -
UVa Problem 704 Colour Hash (色彩缤纷游戏)
//版权所有(C)2015 何伟亮//本题若直接采用正向搜索会搜索16层的深度 由于深度太深搜索的元素太多会导致速度大为降低,所以我采用正向搜索和反向搜索相结合的方式//先反向搜索9层的深度并将所有可能出现的情况放入cache中 然后正向搜索8层的深度如果在搜索的过程中发现结果已经在cache中则说明是可以//在16步之内找到通往目标序列的方法,否则则无法找到.#include <iostre原创 2015-07-03 17:17:30 · 425 阅读 · 0 评论 -
uva 104 arbitrage(套利)
//uva 104 arbitrage(套利)//版权所有(c) 2015 heweiliang//题目描述://输入://3//1.2 .89//.88 5.1//1.1 0.15//输出://1 2 1//输入描述:3为货币种数 接下来三行为 每种货币对于其他货币的兑换比例//题目描述:题目要求出兑换的次数最少(且次数少于或等于n次)的并且满足// 兑换后原创 2015-07-11 21:08:08 · 711 阅读 · 0 评论 -
leetcode-Maximal Square
这里本来要申请一个动态的二维数组的 可是没有想出怎么申请一个动态的二维数组 就申请了一个一伟数组当二维数组用了 dp[i][j] 代表以i j为右下角的最大面积的正方形的边长 if(matrix[i][j]==’1’)dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1 else dp[i][j]=0; 下面是提交的代码#include <原创 2015-12-12 10:41:39 · 337 阅读 · 0 评论 -
codeforces148e
http://codeforces.com/problemset/problem/148/E 题目的大意就是有n个架子编号 1~n 每个瓷器 每个瓷器都有自己的价值 从一个架子取瓷器的时候只能从最左边开始 或者从最右边开始 不能从中间开始取瓷器 问从n个架子中取出m个瓷器 的最大价值是多少 用maxvalueeachline[i][j]代表从第i行取出j个瓷器的最大价值 maxvalu原创 2015-11-26 21:23:00 · 458 阅读 · 0 评论 -
leetcode-dungeon-game
https://leetcode.com/problems/dungeon-game/ 这个题目本来想用的代码如下 就是使用一个DFS来确定当前的hp值能否到达目标地点 再求最小的hp值的时候是递增的 不断地增加hp值看能否到达目标地点 但是最后提交的时候超时了 时间复杂度太高了 这种方法#include <iostream>#include <vector>using namespac原创 2015-11-28 15:52:50 · 347 阅读 · 0 评论 -
87. Scramble String
class Solution {public: bool isScramble(string s1, string s2) { if(s1==s2) return true; if(s1.size()!=s2.size())return false; map<char,int> count; for(i原创 2016-07-27 10:44:18 · 533 阅读 · 0 评论