dp
剁diodio
这个作者很懒,什么都没留下…
展开
-
LeetCode 1388. 3N块披萨 线性dp
题解: 第一步:转化题意: 如果我们要取在数组中的一个数。那么它左右相邻的数都没办法取。以此类推,取的第一个数就与第二数不是相邻的,那么题意就转变为:在长度为3*n的数组取n个不相邻的数的最大值。 第二步: 考虑dp做法。 dp[i][j][0]表示:选第i个数时已经选了j个数了。(第三维表示是否选择了第一位) 那么可以从dp[j][i][0]转移过来。 那么转移方程: dp[i][k][1]=max(dp[j][k-1][1]+slices[i],dp[i][k][1]); dp[i][k][0]=ma.原创 2022-01-05 20:30:25 · 219 阅读 · 0 评论 -
TZOJ 6455: 学学学 状压dp
题目描述: 题解: 难道是上一道的状压dp给了我自信?难道还是我真的有做dp的天赋?(逃 这里我们直接枚举(1<<17)种情况就好了。如果当前状态满足。 那我们就在这个状态的基础上减掉一种算法,然后检测这种状态是否满足。如果满足,我们就可以直接转移了。 #include<bits/stdc++.h> using namespace std; const int N=1e5+5; typedef long long LL; int n,m; int f[20][20]; LL dp[原创 2022-01-04 18:38:00 · 236 阅读 · 0 评论 -
LeetCode 1349. 参加考试的最大学生数 状压dp
题目描述: 题解: 模拟周赛的时候卡住了,就直接去看题解去了(hh 看了题解其实很简单: 枚举每一列dp[i][j],i表示第i行,j表示第i行的每一种状态。 判断第j种是否成立。 如果成立就枚举它前面一行的k的状态。如果满足条件,后面一排的人看不到前一排的人的答案,那我们就可以愉快的状态转移了: dp[i][j]=max(dp[i-1][k]+num,dp[i][j]) num表示这一行的人数。 class Solution { public: bool check(int k,vector&l原创 2022-01-04 18:31:28 · 352 阅读 · 0 评论