
DP
动态规划
SYaoJun
这个作者很懒,什么都没留下…
展开
-
CD91 排成一条线的纸牌博弈问题
题目考查点:区间DP 博弈题目:排成一条线的纸牌博弈问题思路:两个数组,f表示先手的最大值s表示后手的最大值,最后求两个值的最大值。详情参考左程云的面试指南书籍。代码时间复杂度O(n2)O(n^2)O(n2)#include <bits/stdc++.h>using namespace std;const int N = 5010;int a[N], f[N][N], s[N][N];int main(){ int n; cin>>n; for(in原创 2021-10-04 13:22:49 · 348 阅读 · 0 评论 -
解码方法【两道经典题】
解码方法91 Decode Ways考点:递推 或者 动态规划class Solution {public: int numDecodings(string s) { // 进阶版 青蛙跳台阶 // f[i]表示前i个数总的解码方案数,分析最后一个不同点,第i位可以是一个字符组成的字母,也可以和前一位结合组成的字母。 int n = s.size(); s = ' ' + s; vector<int&g原创 2021-09-27 08:25:40 · 280 阅读 · 0 评论 -
RMQ区间最大值【模板题】
模板151nod题目链接区间dp2的幂次#include <iostream>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int N = 2e5+5, M = 18;int f[N][M], w[N];int n;void init(){ //区间dp for(int j = 0; j <原创 2021-08-01 09:40:12 · 163 阅读 · 0 评论 -
845. 数组中的最长山脉
题目连接解题思路:简单的动态规划题注意点:数组为空时需要特判class Solution {public: int longestMountain(vector<int>& A) { if(A.empty()) return 0; //两个数组,一个数组记录从左往右的最大值 //另一个数组记录从右往左的最大值 int n = A.size(); vector<int> B(n原创 2020-10-25 10:04:51 · 319 阅读 · 1 评论 -
数字和为sum的方法数
牛客网题目公司:滴滴出行类型:动态规划难度:中等题意:从n个数中找出组合成m的方案数。#include <iostream>#include <cmath>#include <cstring>#include <algorithm>#include <string>#include <unordered_map&...原创 2020-04-28 10:37:21 · 263 阅读 · 0 评论 -
494. 目标和
题目类型:动态规划 深搜难度:中等版本1暴搜 选与不选时间复杂度O(2n)O(2^n)O(2n)class Solution {public: int n, res = 0; void dfs(int u, vector<int>&nums, long long target){ if(u==n){ if(...原创 2020-04-23 21:50:44 · 206 阅读 · 0 评论 -
749. 约翰的后花园
lintcode题目类型:枚举难度:入门版本1两重循环枚举。class Solution {public: string isBuild(int x) { bool flag = true; for(int i = 0; i <= 1000; i++){ for(int j = 0; j <= 1000; j+...原创 2020-04-13 10:41:55 · 183 阅读 · 0 评论 -
最长公共子序列
题目类型:动态规划题意:找到最长公共子序列的长度,不要求连续。class LCS {public: int findLCS(string A, int n, string B, int m) { vector<vector<int>> dp(n+1, vector<int>(m+1)); int res = 0;...原创 2020-03-27 15:34:05 · 263 阅读 · 0 评论 -
最长公共子串
题目类型:动态规划题意:求连续的最长公共子串class LongestSubstring {public: int findLongest(string A, int n, string B, int m) { int res = 0; vector<vector<int>> dp(n+1, vector<int>...原创 2020-03-27 15:30:22 · 130 阅读 · 0 评论 -
上台阶
题目公司:京东类型:动态规划 斐波那契数列题意:注意开始位置是台阶1class GoUpstairs {public: int f[103]; const int M = 1e9+7; int countWays(int n) { memset(f, 0, sizeof f); f[1] = 0; f[2] = 1;...原创 2020-03-27 14:58:16 · 254 阅读 · 0 评论 -
300. 最长上升子序列
LeetCode版本1时间复杂度O(n2)O(n^2)O(n2)class Solution {public: int lengthOfLIS(vector<int>& nums) { if(nums.empty()) return 0; int n = nums.size(); vector<int&g...原创 2020-02-29 19:18:30 · 107 阅读 · 0 评论 -
01背包问题【AcWing闫雪灿讲解版】
AcWing题目链接#include<iostream>using namespace std;const int maxn = 1010;int w[maxn], v[maxn];int dp[maxn] = {0};int main(){ int N, V; cin>> N >> V; for(int i = 1; i <= N; i...原创 2019-08-22 07:19:23 · 752 阅读 · 0 评论 -
机器人走方格I
数组要初始化为0class Robot {public: int dp[13]={0}; int countWays(int x, int y) { for(int i = 1; i <= x; i++) for(int j = 1; j <= y; j++){ if(i==1 &&am...原创 2019-10-29 07:46:47 · 108 阅读 · 1 评论 -
上楼梯
(a+b)%c = ((a%c)+(b%c))%c两次取模class GoUpstairs {public: const int N = 1e5+5; const int M = 1e9+7; int countWays(int n) { int F[N]; F[1] = 1; F[2] = 2; F[3...原创 2019-10-29 07:39:15 · 164 阅读 · 0 评论 -
1118 机器人走方格
51 Nod 题目链接题意从一个矩阵的左上角走到右下角,只能往右走和往下走一步,问有多少种走法。解析这是动态规划的经典题,可以使用一维数组优化,同时要在计算的过程中取模。#include <iostream>#include <string>#include <vector>#include <cctype>#include <...原创 2019-10-26 11:05:20 · 185 阅读 · 0 评论 -
包含一
牛客网题目链接这道题和统计1的个数很像,但是有区别,在另一个题中11是算作两个1,而这里只算1个1。#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <vector>#include <cstring>...原创 2019-10-24 22:33:12 · 147 阅读 · 0 评论 -
最长句子
牛客网题目链接DAG最长路需要用到动态规划,注意容器清空。#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <vector>#include <cstring>#include <unorde...原创 2019-10-24 20:24:40 · 184 阅读 · 0 评论 -
1040 有几个PAT (25 分)
p数组统计当前位置之前有多少个Pt数组统计当前位置后面有多少个T当遇到A时就计算两者的乘积再加上之前的结果再取模存在大量重复计算,所以可以视为简单动态规划题#include<bits/stdc++.h>char str[100005];int p[100005]={0};int t[100005]={0};int main(){ scanf("%s",str);...原创 2019-01-28 14:35:34 · 201 阅读 · 0 评论 -
1015. 摘花生
这道题是从数字三角形变形而来f[i][j]表示从(1,1)走到(i,j)的所有路线的最大值集合划分为:最后一步是从上面下来和最后一步是从左边过来边界情况:当在左边和最右边时,只有一种方案,但是可以用多余的全零行和全零列替代#include <iostream>#include <cstdio>using namespace std;const int N = ...原创 2019-09-15 08:53:11 · 168 阅读 · 0 评论 -
1018. 最低通行费
求最小值数字三角形的变形#include <iostream>#include <cstdio>using namespace std;const int N = 110;int f[N][N], w[N][N];int main(){ int n, x; scanf("%d",&n); for(int i = 1; i &...原创 2019-09-15 09:14:04 · 259 阅读 · 0 评论 -
1027. 方格取数
变量太长了可以用一个变量的引用来替代三维数组第一次用#include <iostream>#include <algorithm>using namespace std;const int N = 15;int w[N][N];int f[2*N][N][N];//k表示横纵坐标之和 当i1 == i2时 说明两次走到了相同位置 所以该数只能取一次int ...原创 2019-09-15 09:59:21 · 127 阅读 · 0 评论 -
898. 数字三角形
xy zx位置上的最大值取决于y和z的最大值加上x本身的值,可以用一维数组从底至顶迭代。边界条件是最底层的最值就是这一行本身。#include <iostream>#include <algorithm>using namespace std;const int N = 505;int a[N][N], g[N];int main(){ int ...原创 2019-09-29 18:01:45 · 149 阅读 · 0 评论 -
1049. 大盗阿福
自动机0——> 00——>11——>0因为不许抢两个相邻商店 所以不允许从1到1#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 100010, INF = 0x3f3f3f3f;int n...原创 2019-09-29 19:58:54 · 120 阅读 · 0 评论 -
1057. 股票买卖 IV
状态机注意买卖的定义#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 100010, M = 110, INF = 0x3f3f3f3f;int n, m;int w[N];int f[N][M][2];i...原创 2019-09-29 20:21:13 · 153 阅读 · 0 评论 -
矩阵的最小路径和
dp+滚动数组注意边界设定为无穷大,因为每次要求最小值。#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 2003;int arr[N][N];int dp[N];int main(){ int m, n; scan...原创 2019-09-30 09:40:29 · 198 阅读 · 1 评论 -
子数组的最大累加和问题
DP只要累加和大于零 前面的这部分就有利用价值 在过程中求最大值#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 1e5+5;typedef long long LL;int arr[N];int main(){ i...原创 2019-09-30 11:30:50 · 213 阅读 · 0 评论 -
L2-014 列车调度 (25 分)
18/25两个测试点超时我是直接模拟的虽然看了很多大佬的代码很简洁,但是我真的理解不了。心态炸裂#include <iostream>#include <algorithm>#include <string>#include <vector>#include <deque>#include <cstring>...原创 2019-09-07 09:49:21 · 430 阅读 · 0 评论 -
1043. Partition Array for Maximum Sum
class Solution {public: int maxSumAfterPartitioning(vector<int>& A, int K) { int n = A.size(); //dp题 花花酱 vector<int> dp(n+1, 0); for(int i = 1; i <= n; ...原创 2019-09-06 21:44:24 · 93 阅读 · 0 评论 -
第二题【上海交通大学】
题目链接解题思路这道题卡了我好久,很难受,又是01背包或者DFS的题,但是我没给t赋初值,让我调了快1个小时,然后就是剪枝!#include <string>#include <iostream>#include <algorithm>#include <vector>using namespace std;vector<int...原创 2019-08-02 17:06:45 · 223 阅读 · 0 评论 -
最大子矩阵【北京大学】
题目链接很经典的一道题最大子矩阵是最大字段和在二维中的扩展,首先需要对整个矩阵进行降维处理,iii表示起始行,jjj表示终止行,将i−ji-ji−j之间的行,对应的行求和,形成一个一维数组,然后在该数组中求最大子段和,iii和jjj遍历mmm行,故时间复杂度为O(n3)O(n^3)O(n3),最大值在计算过程中顺带标记并输出。#include<iostream>#include...原创 2019-07-29 16:05:53 · 466 阅读 · 0 评论 -
1045 Favorite Color Stripe (30 分)
题目链接最长不下降序列将规定的数字顺序映射到一组递增序列很关键#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;int arr[maxn],Hash[205],dp[maxn];int main(){ int n,m,k,t=0,x; cin>>n>>m; mems...原创 2019-07-23 20:23:30 · 230 阅读 · 0 评论 -
1093 Count PAT's (25 分)
一道简单动态规划的题没想到转眼间就3月1号了,我昨天还想着2月剩下的几天可以把这个月的原创数量增加到70呢,结果临睡前才发现3月已经到来了。#include<cstdio>#include<cstring>int main(){ const int maxn=1e5+5; char str[maxn]; int dp[maxn],dt[maxn]; scan...原创 2019-03-01 13:36:41 · 174 阅读 · 0 评论 -
1007 Maximum Subsequence Sum (25 分)
动态规划简单题注意:要求输出的内容是:最大和,开始元素,结束元素(不是开始下标和结束下标)只要理解了动态规划如何求得最大和的过程和就和理解如何记录开始元素。另外,最大值不要先入为主的设置为0,否则有个测试点会通不过。#include<cstdio>#include<cstring>#include<algorithm>using namespac...原创 2019-02-12 21:17:35 · 180 阅读 · 0 评论 -
7-1 最大子列和问题 (20 分)
dp[i]表示以A[i]作为末尾的连续序列的最大和,即A[i]必须作为连续序列的末尾。动态规划经典入门题#include<cstdio>#include<algorithm>using namespace std;const int maxn=10010;int A[maxn],dp[maxn];int main(){ int n; scanf("%d",...原创 2019-02-11 17:32:17 · 577 阅读 · 0 评论 -
数塔【HDOJ2084】
查看原题目请点我这里 解题思路 题目已经说了这是动态规划的题,需要注意的地方是可以用滚动数组节省空间,注意是从前面往后面滚动,因为前面的数值一旦确定以后在当前行就不会再使用。#include<cstdio>#include<cstring>int arr[110][110];int max(int a,int b){ return a>b?a:b...原创 2018-03-17 11:55:12 · 190 阅读 · 0 评论 -
Bone Collector【HDOJ2602】
01背包问题#include<cstdio>#include<cstring>int max(int a,int b){ return a>b?a:b;}int main(){ int T; int w[1005],c[1005]; scanf("%d",&T); for(int i=0;i<T;i++){ memset(w,0,siz原创 2018-01-08 14:51:39 · 276 阅读 · 0 评论 -
HDOJ一只小蜜蜂...
一只小蜜蜂...Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 56370 Accepted Submission(s): 20398Problem Description有一只经过训练的蜜蜂只能爬向右原创 2016-02-29 20:38:23 · 571 阅读 · 0 评论 -
NYOJ——01串
解题思路:长度为n时,这个串的末尾一个数字,可以是0或者1,当为0时,跟f[n-1]有相同的种数,当为1时,n-1只有一种选择,就是0,因为不能出现11,所以n-1固定,相当于n-2的种数,所以f[n] = f[n-1] + f[n-2] 有了递推公式,既可以先算出来,再查表,或者边算边求。#include#include using namespace std;int main原创 2016-02-28 15:05:13 · 474 阅读 · 0 评论 -
子串和
描述 给定一整型数列{a1,a2…,an},找出连续非空子串{ax,ax+1,…,ay},使得该子序列的和最大,其中,1<=x<=y<=n。 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100<=I<=100),表示数列中的所有元素。(0 < n<=1000000) 输出 对于每组测试数据原创 2019-10-10 17:01:54 · 524 阅读 · 0 评论 -
最大连续子序列【浙江大学】
题目链接#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;int arr[maxn];int dp[maxn];int pre[maxn];int main(){ int n; while(cin>>n){ if(n==0) break; for(int i=1;i&l...原创 2019-08-02 19:12:34 · 163 阅读 · 0 评论