随笔分类 - 题解6
摘要:首先要考虑两个人的策略分别是什么,显然A每次要吃最小的蛋糕,B要么不吃,要么就把一种类的蛋糕全部吃完。所以也是动态规划dp[i][j]表示吃第i种蛋糕,B吃了j次后x的最小值 `#include<bits/stdc++.h> using namespace std; define int long
阅读全文
摘要:动态规划,dp[i][j],j=0/1表示此人说真话还是假话,因为说谎者的数据不可信,所以转移时没有任何条件dp[i][1]=dp[i-1][0];而说真话的人有两种情况,前一个人说真话或者说假话,分开讨论,最后结果就是dp[n][0]+dp[n][1]; `#include<bits/stdc++
阅读全文
摘要:将第一个序列标号,所以序号和值就相互映射,再将第二个序列用映射转变一下,最后只要求转变后的序列的最长上升子序列就行了,求lis只要维护一个单调递增的栈,大于栈首就入栈,小于栈首就用二分查找替换最小的大与它的数 `#include include include include<math.h> usi
阅读全文
摘要:将m个宝物一一拆开,就是普通的0-1背包问题,但是这样会超时,所以想到用二进制拆分m,最后再当做0-1背包问题 `#include include include include<math.h> using namespace std; const int N=2e7+7; int w,n; int
阅读全文
摘要:最基础的0-1背包问题,没什么好说的 `#include include include include<math.h> using namespace std; const int N=2e5+7; int t,m; int lst[107][2]; int memory[107][1007]={
阅读全文
摘要:只要维护一个dp[i]就行了,dp[i]表示以i结尾的最大字段和,要么是第i个数本身,要么是第i个数加上dp[i-1],只要dp[i-1]>0,那么就肯定是后者 `#include const int N=2e5+7; int main(){ int n,lst[N]={0}; scanf("%d"
阅读全文