DP
Weach
学生
展开
-
AcWing 285. 没有上司的舞会--树形DP
AcWing 285. 没有上司的舞会题目描述Ural 大学有 N 名职员,编号为 1∼N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数 N。接下来 N 行,第 i 行表示 i 号职员的快乐指数 Hi。接下来 N−1 行,原创 2021-09-15 20:46:27 · 87 阅读 · 0 评论 -
AcWing 1252. 搭配购买--并查集+01背包
AcWing 1252. 搭配购买#include<bits/stdc++.h>#include <unordered_map>using namespace std;template<class...Args>void debug(Args... args) {//Parameter pack auto tmp = { (cout << args << ' ', 0)... }; cout << "\n";原创 2021-07-16 17:27:52 · 101 阅读 · 0 评论 -
POJ 2955 Brackets--区间DP
POJ 2955 Brackets//#include<bits/stdc++.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;template <typename T> void debug(string s, T x) { cout << s << "=" << x << "\n"原创 2021-07-11 11:30:52 · 57 阅读 · 0 评论 -
Codeforces Round #723 (Div. 2) B. I Hate 1111--数论,dp
定理:a,b互质,则a,b最大不能表示出的数是ab-a-b原创 2021-06-07 11:34:53 · 155 阅读 · 0 评论 -
最短Hamilton路径--状压dp
最短Hamilton路径用f[i][j]表示当前已经走过点的集合为i,移动到j所以状态转移方程就是找一个中间点k,将已经走过点的集合i中去除掉j(表示j不在经过的点的集合中),然后再加上从k到j的权值那么问题在于如何表达已经走过点的集合i,其实很简单,假如走过0,1,4这三个点,我们用二进制10011就可以表示,2,3没走过所以是0那么走过点的集合i中去除掉点j也很容易表示i - (1 << j),比如说i是{0,1,4},j是1,那么i = 10011,(1 << j) =原创 2021-04-13 19:53:13 · 102 阅读 · 0 评论 -
P2602 [ZJOI2010]数字计数--数位dp,dfs
题目#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll N = 1e3 + 5;const ll MOD = 1e9 + 7;const ll INF = 0x7fffffff;ll a[20];ll m;ll f[N][10];ll dfs(ll rest, ll sum, ll x, bool lead, bool limit){//没有前导0时lead为True if (re原创 2021-04-05 20:59:48 · 106 阅读 · 0 评论 -
P2657 [SCOI2009] windy数--数位dp,dfs
题目#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll N = 1e3 + 5;const ll MOD = 1e9 + 7;const ll INF = 0x7fffffff;ll f[N][10];//表示有i位数字且最高位是j的情况下满足条件的总和void init() {//预处理f数组 for (ll i = 0; i <= 9; i++) {//只有1位的情况下原创 2021-04-04 19:49:18 · 138 阅读 · 1 评论 -
HDU 2089 不要62--数位dp,dfs
HDU 2089 不要62题目#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll maxn = 1e3 + 5;const ll MOD = 1e9 + 7;const ll INF = 0x7fffffff;ll f[maxn][10];//表示有i位数字且最高位是j的情况下满足条件的总和void init(){//预处理f数组 for (ll i = 0; i <=原创 2021-04-02 20:53:11 · 137 阅读 · 0 评论 -
能量项链--区间dp典例
题目思路1.断环成链2.区间大小枚举3.区间起点枚举4.区间的划分枚举分析1.可以采用处理环形问题的通用技巧,即复制一份接到后面。这里虽然输入是N个数,但实际上我们要求的是长N + 1的区间的最大能量,所以要将这N个数重复一遍拼在后面,形成长2 N的数组,这样就转化为了线性问题2.用dp[l][r]来代表区间(l,r)内所有珠子合成的这一颗能量珠所可能释放的最大能量。在区间( l , r )内,能量珠dp[l][r]的头标记为 a[ l ],尾标记为 a[ r+1 ] 用k将区间分成 l~原创 2021-03-31 15:09:31 · 158 阅读 · 0 评论 -
石子合并--区间dp典例
题目输入 :41 3 5 2输出:22分析第一阶段:dp[1][1],dp[2][2],dp[3][3],dp[4][4]因为一开始还没有合并,所以这些值应该全部为0。第二阶段:两两合并过程如下,其中sum(i,j)表示石头的数量,即从i开始数j个数的和dp[1,2]=dp[1,1]+dp[2,2]+sum[1,2];dp[2,3]=dp[2,2]+dp[3,3]+sum[2,3];dp[3,4]=dp[3,3]+dp[4,4]+sum[4,4];第三阶段:三三合原创 2021-03-30 17:16:19 · 107 阅读 · 0 评论 -
poj1163 数字三角--dfs||dp
题目DFS代码#include<iostream>using namespace std;typedef long long ll;const ll maxn = 1e3 + 5;const ll MOD = 1e9 + 7;const ll INF = 0x7fffffff;ll n;ll a[maxn][maxn];ll dp[maxn][maxn];ll dfs(ll i,ll j) { if (i == n)return a[i][j];原创 2021-03-29 20:56:33 · 92 阅读 · 1 评论 -
LCS,LIS,LCIS代码总结
最长公共子序列题目#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll maxn = 1e3 + 5;const ll MOD = 1e9 + 7;const ll INF = 0x7fffffff;ll dp[maxn][maxn];ll LCS(string s1, string s2) { memset(dp, 0, sizeof(dp)); for (ll i =原创 2021-03-28 21:01:36 · 232 阅读 · 0 评论 -
背包九讲代码总结
代码模板总结:#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll maxn = 1000005;ll dp[maxn];ll cost[maxn], weight[maxn], amount[maxn];ll n, v;void ZeroOnePack(ll cost, ll weight) { for (ll j = v; j >= cost; --j)//逆序枚举原创 2021-03-28 20:23:56 · 185 阅读 · 0 评论