动态规划
循环是人递归是神
北京邮电大学
展开
-
关于数位DP的一些思考
题目:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。int nums[20];int dp[20][2][20];//pos表示当前位置,从最高位开始处理//s表示在之前的pos,数位有无小于最高上限//ok表示当前状态下1的个.原创 2021-01-14 19:21:09 · 113 阅读 · 1 评论 -
uva 437 The Tower of Babylon
题目:https://vjudge.net/problem/UVA-437#include<iostream>#include<algorithm>#include<queue>#include<cmath>#include<math.h>#include<string>#include<string.h>#include<map>#include<unordered_map>.原创 2020-05-20 18:48:16 · 95 阅读 · 0 评论 -
uva 1025 A Spy in the Metro
题意:典型dp问题,每次遇到dp,感觉初始化都好难^、^。下面给三种动态规划1递归思维的动态规划(没用到递归)memset(dp, 0x3f, sizeof(dp));dp[0][1] = 0; for (int i = 0; i <= T; i++){ for (int j = 1; j <= n; j++) { if (i + 1 <= T) dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + 1); if ..原创 2020-05-20 14:54:52 · 105 阅读 · 0 评论 -
镶嵌矩形和硬币问题
镶嵌矩阵#include<iostream>#include<algorithm>#include<queue>#include<cmath>#include<math.h>#include<string>#include<string.h>#include<map>#include<unordered_map>#include<unordered_set>#原创 2020-05-19 18:34:50 · 151 阅读 · 0 评论 -
322. 零钱兑换
动态规划问题,也可以用记忆dfs做//动态规划int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount+1,0x3f3f3f3f); dp[0] = 0; for(int i = 1;i <= amount;i++) { for(int j:coins) { .原创 2020-05-16 17:00:10 · 100 阅读 · 0 评论 -
uva 11059 Maximum Product
题目:https://vjudge.net/problem/UVA-11059题意::求连续数的最大乘机,注意可以负负得正(⊙o⊙)#include<iostream>#include<algorithm>#include<queue>#include<cmath>#include<math.h>#include<string>#include<string.h>#include<map>.原创 2020-05-09 23:53:33 · 90 阅读 · 0 评论 -
atcoder 163
Ehttps://atcoder.jp/contests/abc163/tasks/abc163_e#include <cstdio>#include <cstring>#include <algorithm>using namespace std;long long f[2010][2010], p[2010], a[2010], ji[...原创 2020-05-09 22:51:40 · 169 阅读 · 0 评论 -
983. 最低票价
动态规划 int mincostTickets(vector<int>& days, vector<int>& costs) { int dp[368]; memset(dp,0x3f,sizeof(dp)); dp[0] = 0; int days_idx = ...原创 2020-05-08 23:41:18 · 84 阅读 · 0 评论 -
1434. 每个人戴不同帽子的方案数
int numberWays(vector<vector<int>>& hats) { int n = hats.size(); const int MOD = 1e9 + 7; vector<int> dp(1 << n); dp[0] = 1; vector<vector<int>> s(4...原创 2020-05-09 09:29:00 · 190 阅读 · 1 评论 -
3. 无重复字符的最长子串
int lengthOfLongestSubstring(string s) { int len = s.size(); if(len == 0) return 0; vector<int> dp(len, 0); dp[0] = 1; int maxlen = 1; ...原创 2020-05-09 09:41:23 · 166 阅读 · 0 评论 -
5180. 带限制的子序列和
状态方程dp[i]定义为:包含i的前i个数构成最大和 (当然是满足下标条件的最大和~)dp[i] = max(dp[i],dp[i-j]+nums[i]); j取值0~k在这里,每次回去寻找前面k个数中,哪个数构成和最大。循环过程中,前一次循环和本次的前k个数有k-1个数是相同的,利用这一特点可以进行优化。``` //dp[i]定义为:包含i的前i个数构成最大和(当然是满足下标...原创 2020-05-09 21:49:03 · 137 阅读 · 0 评论 -
72. 编辑距离
int minDistance(string s1, string s2) { int m = s1.size(), n = s2.size(); vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); for (int i = 1; i <= m...原创 2020-05-09 22:03:46 · 73 阅读 · 0 评论 -
1143. 最长公共子序列
int longestCommonSubsequence(string s1, string s2) { int m = s1.size(),n = s2.size(); vector<vector<int>> dp(m+1,vector<int> (n+1,0)); for(int i = 0;i &l...原创 2020-05-09 22:05:25 · 91 阅读 · 0 评论 -
牛客 最长上升子序列
int lengthOfLIS(vector<int>& nums) { if (nums.size() == 0) return 0; int len = 1; vector<int> dp(nums.size(), 1); for (int i = 1; i < nums.size(); i++) { for (int j = 0; ...原创 2020-10-09 13:08:01 · 301 阅读 · 0 评论