算法日记
平心处
这个作者很懒,什么都没留下…
展开
-
背包问题学习8——poj2184——01背包变形
题目链接1.思想转换对于每头牛,要么选要么不选,有点类似于01背包,但是又有两个参数:智力值和幽默值,我们设dp[i]为智力值为i时对应的幽默值最大,最终选择完后能够得到最大的幽默值,...原创 2021-05-17 10:30:10 · 111 阅读 · 1 评论 -
背包问题学习7——poj3181——高精度大数处理
题目链接数据超过范围时的处理方法#include<iostream>using namespace std;#define ll long longconst ll inf=1e18;int main(){ int n,k; while(cin>>n>>k){ ll dp[1005]={0},a[1005]={0}; dp[0]=1; for(int i=1;i<=k;i++){原创 2021-05-17 09:28:34 · 133 阅读 · 0 评论 -
背包问题学习6——poj——1787——记录路径
记录路径的代码书写注意点1.因为是记录路径,所以要一个一个的背包进行更新,不能使用二进制代码优化2.主要代码部分if (dp[j - v[i]] + 1 > dp[j] && dp[j - v[i]] && used[j - v[i]] < num[i]) { dp[j] = dp[j - v[i]] + 1; used[j] = used[j -原创 2021-05-15 22:40:53 · 342 阅读 · 0 评论 -
背包问题学习5——循环细节——poj2163
题目链接1.循环细节写出相应代码后,如果循环明显会超时,则考虑优化可能的优化角度(1)代码本身能够优化:比如背包的二进制优化,即是对代码本身进行优化(2)题目条件进行优化:比如说这个题,本金和固定bond部分都是1000的倍数,从而对循环量进行优化对第二条也要警惕些,从第二条感觉到题目的输入部分对数据量的描述也要警惕了(能够优化循环量)2.题目代码#include<iostream>#include<cstdio>#include<cstring>u原创 2021-05-12 22:20:10 · 131 阅读 · 1 评论 -
背包问题学习4——上界确定(鸽笼原理)、二进制代码优化放进循环中——poj3260(补充理解)
题目链接1.二进制代码优化放进循环中的代码for (i = 1; i <= n; i++) { for (k = 1; k <= num[i]; k *= 2) { for (j = vol; j >= k * val[i]; j--) { dp[j] = min(dp[j], dp[j - k * val[i]] +原创 2021-05-12 00:49:23 · 162 阅读 · 4 评论 -
背包问题学习3——dp状态覆盖
poj1276/作业题O做题时漏掉的点:dp状态更新覆盖掉了之前的状态反思点:降维时要考虑之前的状态是否会被覆盖掉#include <iostream>#include <stdio.h>#include <algorithm>#include <stdlib.h>#include<vector>#define N 10#define maxn 10010#define maxnn 100010using namespace原创 2021-05-07 21:30:32 · 135 阅读 · 1 评论 -
背包问题学习2——hdu1059——思维转换、二进制优化
题目链接1.思维转换两个人分的石子重量值相同,等效成一个人分得一半的石子值,瞬间出来了背包问题模板也就是说有相同量要归到最小规模——便于表示、出思路2.二进制优化代码模板int j = 1; for (int i = 1; i <= N; i++) { int temp = 1; while (a[i] > temp) { c[j++] = temp原创 2021-05-06 23:18:18 · 134 阅读 · 1 评论 -
Same Differences——STL容器中的unordered_map学习
题目链接 #include <iostream> #include <string> #include <unordered_map> #include <algorithm> using namespace std; #define ll long long //1.开ll,不然会WA unordered_map<ll, ll> vis; //2.假定这里写int,int,后原创 2021-05-06 12:10:49 · 97 阅读 · 0 评论 -
浮点数转换成整型数保留精度——UVA147——dollars
题目:New Zealand currency consists of $100, $50, $20, $10, and $5 notes and $2, $1, 50c, 20c, 10c and 5c coins. Write a program that will determine, for any given amount, in how many ways that amount may be made up. Changing the order of listing does not in原创 2021-05-05 22:34:03 · 208 阅读 · 0 评论 -
背包问题学习1——去除dp后效性——hdu3466——Proud Merchants
作业题E/hdu3466#include<algorithm>#include<iostream>#include<vector>using namespace std;const int maxn = 5001;int n, m;int dp[maxn];struct xiao{ int pi, qi, vi;}a[maxn];bool cmp(xiao x, xiao y){ return x.pi - x.qi > y原创 2021-05-05 09:42:46 · 212 阅读 · 0 评论 -
Gym_102220_B_Balanced Diet(动态数组+前缀数组)
这个题在比赛时出思路了,可惜自己没有想到用动态数组减少循环量,用普通数组双重循环会导致超时,因此特意写此篇博客,以此来熟悉动态数组#include <map>#include <vector>#include <string>#include <iostream>#include<algorithm>using namespace std;#define ll long long#define maxn 100010vecto原创 2021-05-04 08:50:58 · 275 阅读 · 0 评论 -
区间dp学习5——hdu 5115——Dire Wolf——做题反思
这是原题链接(愣着干嘛,不知道题就点我呀)这个题令我对区间dp有了新的理解,很满足能够在做题慢的情况下能够对题目所涉及的知识最大程度掌握前面的分析过程我学到了很多,还有一个学习到的点是边界区间枚举,这是区间dp第二种表达方式经常需要处理的点对应的网上代码(主要实现部分) memset(dp,INF,sizeof(dp)); for(int i=1;i<=n;i++) dp[i][i]=a[i]+b[i-1]+b[i+1];///区间长度为1的时候的情况原创 2021-04-21 23:15:58 · 176 阅读 · 0 评论 -
区间dp学习4——poj 1651 Multiplication Puzzle——题后反思
在做这个题时自己对区间dp已经有一定的熟练度了,只不过欠缺了一个思维,这个题为我提供了一个补充这题又学到了一个思维:简化可能性也就是说,当你分类时,顺着分可能性很多的情况下,倒着分,直接去考虑最后一步比如:看我的思考(模拟)过程(错误的)思路修正:代码如下:#include<iostream>#include<cstring>#include<algorithm>#include<iomanip>using namespace std;原创 2021-04-20 14:49:37 · 174 阅读 · 2 评论 -
区间dp学习3——括号匹配 ——做题反思
在dp这里最重要的是思考过程,代码不细写了,思考有了代码自然有的#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 200;char a[N];int dp[N][N];int solve();int main(){ while (cin >> a + 1) { if (a[1] == 'e' &&a.原创 2021-04-20 12:58:47 · 122 阅读 · 0 评论 -
区间dp学习2——打表、四边形优化区间枚举(四边形区间优化学习1)
区间dp有两种表示方式,这两种方式打出的表格完全一致,但在顺序上有所不同,在这里用回文串题进行说明(这个题目之前有我的分析、题解,是我反思的挺久的一篇文章,可以先看那个再看打表,可能会更清晰,在这篇文章中不会细讲)链接:回文串题解(愣着干嘛,点我呀)对应的打表顺序图示1在网上还看到其它的区间枚举方式,比如说这种(大概的模板)for(int i=n-2;i>=0;i--){ for(int j=i+1;j<n;j++){ for(int k=i原创 2021-04-19 14:17:45 · 228 阅读 · 0 评论 -
区间dp学习1——回文串(poj 3208) 题后反思
#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<string>#define inf 0x3f3f3f3fusing namespace std;const int N = 300;int m, n;char str[N];int cost[30];int solve();int main(){ cin >.原创 2021-04-18 18:20:27 · 292 阅读 · 3 评论 -
dfs学习3
/*参数设置:什么在变化,就把什么设置成参数void dfs(){ if (到达终点状态) { …//根据题目书写内容 return; } if (越界或者不合法状态) return; if (特殊状态)//剪枝 return; for (扩展方式) { if (扩展方式所达到状态合法) { 修改操作;//根据题意来添加 标记; dfs(); (还原标记); //是否还原根据题意 } }}*///一、dfs全排列原创 2021-04-15 14:07:41 · 156 阅读 · 0 评论 -
dfs学习2
背包回溯法#include<iostream>using namespace std;int n;int volume;int maxvalue = 0;int value[10], weight[10];void dfs(int index, int weight, int value);//1.状态定义:我们选择当前背包,需要确定相应的编号、重量、价值,这三个要素,因此dfs参数能够表示int main(){ cin >> n >> volume原创 2021-04-14 09:59:25 · 136 阅读 · 0 评论 -
防止手滑写错(doge)
原创 2021-04-13 15:04:51 · 127 阅读 · 0 评论 -
dfs学习1
输出全排列//dfs深度搜索全排列知识点标注#include<iostream>#include<algorithm>#include<map>#include<cmath>#include<cstring>#include<set>#include<iomanip>#define inf 0x3f3f3f3f#define maxn 500010using namespace std;int n;原创 2021-04-10 17:06:35 · 191 阅读 · 0 评论 -
Flowers
//标注相应知识点#include<iostream>using namespace std;#define ll long long #define length 100010//1.题目未给出所需要数组的长度,而是给出两个长度,求差值处理,因此,遍历所有情况,方便最终输出#define mod 1000000007ll dp[length];ll sum[length];int main(){ int n, k; while(cin>>n>>k原创 2021-04-07 10:20:40 · 95 阅读 · 0 评论 -
Employment Planning
//标注核心思路及知识点#include<iostream>#include<algorithm>#include<cstring>using namespace std;int dp[14][1500];int a[14];#define inf 0x3f3f3f3fint main(){ int n; while (cin >> n && n) { int i, j, k; int maxn = 0; i原创 2021-04-06 22:31:40 · 154 阅读 · 0 评论 -
Nikita and string
#include<iostream>#include<string>#include<algorithm>using namespace std;#define maxn 5010#define inf 0x3f3f3f3fchar a[maxn];int dp[maxn][3];/* 状态的设计是这个题目的巧妙之处 * 1.第一维度表示个数 * 2.第二维度的数字3表示了三种状态,将题目要求完全涵盖 * (1)0表示当前为a,之前未遇到b * (原创 2021-04-06 17:50:24 · 138 阅读 · 0 评论 -
How to Type
转载链接:https://blog.csdn.net/qq_40129237/article/details/79563172这个题目使我对动态规划有了新的思考(我是看这位博主的题解才做出来的)思考在代码注释中,非常感谢这位博主,代码写的简单易懂#include<iostream>#include<cstring>#include<algorithm>using namespace std;string s;int dp[110][2];/* dp表示相原创 2021-04-05 23:22:50 · 75 阅读 · 0 评论 -
hdu 1160 fat mouse‘s speed
对于我的难点来讲是输出最长上升子序列(某一个),在这里用到了标记,用数组标记以当前数为结尾的最长上升子序列的前一个数,以我个人浅陋的见解,认为这是有记忆化搜索思想的。/* fat mouse’s speed * 1.降低维度,排序将重量维度消掉 * 2.输出最长的上升子序列长度,同时将上升子序列输出 * 这一点我个人认为用到了记忆化搜索,跟动态规划相关性不强 * (1).不知道哪一组数会成为最长的上升子序列,则将所有数据对应的上一个数据进行标记 * (2).最终利用已知的最后一只老鼠原创 2021-04-03 16:14:04 · 125 阅读 · 0 评论 -
最长上升子序列
在这里插入代码片```#include<iostream>#include<cstring>#include<cmath>#include<algorithm>using namespace std;char a[1010], b[1010];int dp[1010][1010];//注意这里设置成int,我在这里栽了无数次int main(){ int n, m; while (cin >> a>> b) /原创 2021-04-03 08:21:09 · 53 阅读 · 0 评论 -
01背包优化
/* 01背包代码优化 * 状态转移方程一维表示(这里maxa[j]表示将当前物品放入后对应的最大价值,也是分成两种情况:取还是不取) * maxa[j]=max(maxa[j],maxa[j-weight[i]]+value[i]) * 伪代码:for(int j=volume;j>=weight[i];j--) * maxa[j]=max(maxa[j],maxa[j-weight[i]]+value[i]); * 单维度表示这一个物品在对应容积下的最优解,倒序输出防止数据被更新,此时导原创 2021-03-31 08:23:24 · 67 阅读 · 0 评论 -
01背包——二维数组(初步学习)
/*动态规划的分类思想为核心思想 *判定n个物品放入有限容积背包的利润最大值,为减少规模,先算一个背包放入容积背包的利润最大值 * 之后求两个背包时,分为能放入和不能放入两种情况,放入时,则考虑两种情况:放入后的利润与放入前的利润 * 在模拟过程中,发现体积也难以确定,但也可以分成有限个小部分,体积也是一个未定量,则将体积从小到大进行判定模拟, 状态表示方程:f(i)(v),i表示相应的背包,v表示装入这个背包的容积(二维表示两个状态量,价值是结果) * 对于每一个物品加入后,容积也是未知的量,则原创 2021-03-29 16:48:49 · 151 阅读 · 0 评论