dp
a10.
这个作者很懒,什么都没留下…
展开
-
codeforces 734 div3 E
题目这题我们用dp,我们可以把状态设为dp[i][j]dp[i][j]dp[i][j]为前i个数字,去除j个以后能满足题目要求的个数。难点就在于吧点数删掉了,应该怎么转移。我们可以想到,我们设某个点的位置为pos,那删除了j个点,新的位置就应该为pos-j,然后就可以转移了。转移方程直接看代码就行。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#inclu原创 2021-08-17 23:01:41 · 116 阅读 · 0 评论 -
atcoder beginner 185 E
题目开始练dp了。设dp[i][j]dp[i][j]dp[i][j]为第一个字符串前i个和第二个字符串前j个,我们只有四种决策,i选j删除,i删除j选,i删除j删除,i选j选,很明显第三种根本没用的,所以我们只选其他三种决策就行。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sstre原创 2020-12-14 23:12:53 · 84 阅读 · 0 评论 -
牛客巅峰赛第六场 钻石B青铜C
题目设dp[i][j][k]dp[i][j][k]dp[i][j][k]为选了前n个音符且m个重音符,第i个音符是否为重音符,k=1是,0不是。那么就可以直接转移了,注意一点细节,当m=1时,只从m=0转移过来,因为第一个可以随便放的。class Solution {public: /** * * @param n int整型 乐谱总音符数 * @param m int整型 重音符数 * @param k int整型 重音符之间至少的间隔原创 2020-12-05 01:09:19 · 94 阅读 · 0 评论 -
牛客练习赛 13 D E F
题目D首先,13!已经超范围了,所以我们只需要对最多最后13位进行康托展开就行。2 3 4的康托展开我们可以映射为1 2 3进行,其他类推,然后就可以写代码了。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sstream>#include<queue>#incl原创 2020-12-02 20:58:28 · 92 阅读 · 0 评论 -
2020蓝桥杯国赛填空题——4
题目这题一开始是想的dp,但是不知道本质不同该怎么处理。后来经过队友的讲解,我们可以设dp[i]dp[i]dp[i]为以i结尾有多少个本质不同上升子序列,我们手玩一下样例可以发现,对于k<j<i,若s[i]>s[j],那么s[j]>s[k]也会包含在s[j]里面,根据这个,我们可以贪心地想,如果s[i]>s[j]&&s[i]>s[k]&&s[j]==s[k],我们只需要统计s[j]的答案就可以了,因为字符在后面,能统计的字符更多。#i原创 2020-11-19 16:58:01 · 195 阅读 · 0 评论 -
计蒜客 数正方形
题目设dp[i][j]dp[i][j]dp[i][j]为i,j这个位置为左上角,能找到的最长正方形边长。我们可以这样考虑,只要在正方形面积里面,没有任何0就可以了。那我们就有这么一个转移方程:dp[i][j]=min(dp[i+1][j],dp[i][j+1],dp[i+1][j+1])+1dp[i][j]=min({dp[i+1][j],dp[i][j+1],dp[i+1][j+1]})+1dp[i][j]=min(dp[i+1][j],dp[i][j+1],dp[i+1][j+1])+1可以这原创 2020-11-19 14:45:27 · 116 阅读 · 0 评论 -
luogu 2663
题目这题一开始用二维费用模板套上去,wa了,为什么呢?我们想想,二维费用背包dp[v][m]状态设计的是体积不超过v以及重量不超过m的最大收益,看回这题,这题明确要求要从全班同学中选出一半,固定了数量,而不是不超过某个数,所以直接套背包模板不大行了。那我们可以这么做,考虑dp[i][j][k]为前i个同学中用了j个同学,是否能到达k分,用可行性背包去做这题。然后转移就可以啦。#include<cstdio>#include<algorithm>#include<i原创 2020-11-06 13:27:59 · 128 阅读 · 0 评论 -
atcoder beginner 178 D
题目设dp[i]dp[i]dp[i]为和为i有多少种方式,然后dp就可以了……蠢了,居然没想到#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sstream>#include<queue>#include<list>#include<stack&g原创 2020-10-24 22:12:29 · 162 阅读 · 1 评论 -
codeforces educational 92 B C
题目B一开始想的是dp,但写不下去,因为不知道怎么找当前的位置在哪里(毕竟限制了不能连续往左走),看了官方题解才知道是k-2*z+1,有了这个就好弄很多了。设f[i][j][k]f[i][j][k]f[i][j][k]为当前走了i步,已经往左走了j次,这一步是向右移动过来的还是向左移动过来的(有限制我们也可以多开状态去储存),转移和细节就直接看代码吧。#include<cstdio>#include<algorithm>#include<iostream>#原创 2020-07-31 19:12:03 · 132 阅读 · 0 评论 -
codeforces 627 div3 D E
题目D我们可以把公式变一下,变成−(ai−bi)<(aj−bj)-(a_{i}-b_{i})<(a_{j}-b_{j})−(ai−bi)<(aj−bj),然后我们就可以按照ai-bi的差进行从小到大的排序,然后用upper_bound去算一下,就可以了。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<sst原创 2020-07-31 18:54:24 · 94 阅读 · 0 评论 -
codeforces 102263 J
题目一开始贪心,直接枚举每个位置,一直wa,不知道错哪里了,后来才发现是dp,很多种情况是无法直接贪心的。设dp[i][0]dp[i][0]dp[i][0]为直接从下往上统计且以第i位为结尾至少要用多少次,dp[i][1]dp[i][1]dp[i][1]为从上往下统计。转移方程直接看代码好了,懒得写了。注意第i位从上往下转移且第i-1位也是从上往下转移时,必须要-2,有两个地方要减去,首先是i-1位可以少减一位,其次是第i位可以免去+10^x这个操作,例如77,模拟一下就懂了。#include<原创 2020-07-27 17:01:14 · 114 阅读 · 0 评论 -
广州大学第十四届ACM大学生程序设计竞赛(同步赛)
题目A这题卡缓冲区,也是第一次见卡这东西,就是……getline被卡了,自己输入一下看一下会出现什么就知道了,可以用cin.ignore()解决,学到了。这题我做的比较复杂,更简单的做法就是直接if判断输出#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<sstream>#include<string>#inc原创 2020-07-27 16:27:15 · 262 阅读 · 0 评论 -
hdu 3336
题目这题其实就是kmp,第一次做字符串算法+dp不大懂,网上对于这题的(好的)解答也比较少,我来写一篇。我们设f[i] 为直到字符串第i个位置,有多少种前缀,最终答案就是sigema(f[i]),注意是种!状态的定义很重要。那么转移方程是f[i]=f[next[i]]+1,为什么是这个呢?是这样子的,直到第i个位置,它自己本身就是一种前缀,所以要+1,那f[next[i]]是什么意思呢?例如ababa这一字符串,next[5]为3(我是以1为下标),因为next数组的定义是最长公共前缀和后缀的长度,我们原创 2020-07-16 10:17:49 · 131 阅读 · 0 评论 -
C语言网 1436
题目好像就普通的记忆化搜索,不过有一些东西注意一下就好了。#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#define int long longusing namespace std;const int mod=1000000007*1LL;int a[55][55],f[55][55][15][15],n,m,k;int dfs(int x,i原创 2020-07-01 01:15:29 · 260 阅读 · 0 评论