![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
FlashCanSavetheWorld
不想起床
展开
-
零钱兑换 II(完全背包问题)
给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3, coins = [2] 输出: 0 解释: 只用面额2的硬币不能凑成总金额3。 题目链接 class Solution { public int change原创 2020-12-06 20:28:56 · 139 阅读 · 0 评论 -
取石子(0-1背包问题变形)
思路:用dp[i]表示,总石子数为i时最少需要拿多少次石头,最后从k到0进行判断次数在m以内的最大石头数即可 题目链接 #include<bits/stdc++.h> using namespace std; const int N = 105; int arr[N]; int dp[3005]; const int inf =0x7ffffff; int main(){ int n,m,k; cin>>n>>m>>k; for(in.原创 2020-12-06 18:51:10 · 136 阅读 · 0 评论 -
P1077 摆花
思路: 该题很明显是一道dp题,用dp[i]’[j]表示第i种花放了j盆时的可能的种数,dp[i]’[j]可以由上一个状态dp[i-1]’[j]转化而来,设当第i种花填了j盆后剩下还可以填k盆能填不超过m盆(k<=m-j),即要满足dp[i]’[j+k]=dp[i-1]’[k],所以dp[m]’[n]即为最后答案 #include<bits/stdc++.h> using namespace std; const int N = 105; const int mod = 1000007;.原创 2020-12-06 12:09:35 · 61 阅读 · 0 评论 -
P2758 编辑距离
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种: 1、删除一个字符; 2、插入一个字符; 3、将一个字符改为另一个字符; !皆为小写字母! 输入格式 第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。 输出格式 只有一个正整数,为最少字符操作次数。 输入 sfdqxbw gfdgw 输出 4 题目链接 思路: 假设用f[i][j]表示将串a[1…i]转换为串b[1…j]所需的最少操作次数(最短距离) 首先是边界: ①i==0时,即a原创 2020-12-06 10:21:16 · 242 阅读 · 0 评论 -
区间dp
#include <iostream> using namespace std; const int N = 255; int w[N]; int sum[N]={0}; int dp[N][N]; int inf = 0x7fffffff; int n; int Minval() { int s[N][N]; for(int i =1;i<=n;i++) { dp[i][i]=0; s[i][i]=i; } f.原创 2020-08-05 20:28:57 · 80 阅读 · 0 评论 -
Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2)C. Bouncing Ball
Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2)C. Bouncing Ball 思路:动态更新每个格子的最小值,最后查找能跳出去的几个格子的最小值即可(注意最后比较时格子长度不能短于p) #include<bits/stdc++.h> using namespace std; const int N = 1e5+5; int arr[N]; int dp[N]; void solve(){原创 2020-12-01 16:03:08 · 92 阅读 · 0 评论