51nod-1636-dp】的更多相关文章

51nod 1636 教育改革 | DP 题面 最近A学校正在实施教育改革. 一个学年由n天组成.A学校有m门课程,每天学生必须学习一门课,一门课程必须在一天内学习完.在学习完第i门课程后,学生们会收到 xi 个家庭作业,其中 xi是区间[ai,bi]里的一个整数 .每门课还有一个属性,就是复杂度 ci .A学校现在要制他们的课程表,具体要求如下: ·在课程表中,随着天数的增加,课程的复杂度是严格递增的. ·除了第1天,每天的作业量必须是前一天的k倍,或者比前一天多k个作业.(假设第i天的作业量…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1154 1154 回文串划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式.   a|bb|aabaa - 3 个回文串 a|bb|a|aba|a - 5 个回文串 a|b|b|a|a|b|a|a - 8 个回文串   其中第1种划…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270 简单的线性dp,最近狂刷水题真的是...药丸 差值最大得话要么是峰顶要么是最小的1,不可能处在中间状态,那样显然没有峰值的贡献大,想通这一点之后方程就好写了, dp[i][0]表示第i个数取最小值的最大代价,dp[i][1]相反. 有 dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i-1]-1); dp[i][1]=max(dp[i-1…
1636 教育改革 我看过题解了还下了数据,表示很惭愧不想说什么,但还是说两句吧 sol: 因为差值很小只有100,所以对数组下标存的是(选择的数值和左端点的差值) f[i][j][k]即为第i天选了第j课 k为上述内容 还有注意转移的时候要保证上一个合法才能转到下一个,就是上一个一定不为0: 听起来不难然而我还是看了题解qwq #include<bits/stdc++.h> using namespace std; #define int long long ]; inline bool c…
题目链接 令f[i][j][k]为第i天选择的课程为j,设置作业为a[j]+k时的最大作业量. 那么f[i][j][k]可以由哪些状态转移而来?先把课程按复杂度排序,那么可以转移来的课程是f[i-1][t][r], 其中t是<j,且复杂度a[t].c严格小于a[j].c. 这是前提条件, 其次, 对于a[t]布置的作业数量r,根据题意需要满足作业j布置的作业(a[j]+k) % r == 0,或者是 (a[j]+k) - K = r. 在这些状态转移中取最值即可. 需要留意的地方:因为bi-ai…
题目链接:51nod 1412 AVL树的种类 开始做的时候把深度开得过小了结果一直WA,是我天真了.. #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; typedef long long ll; ; ; ll dp[N][];//dp[i][k] i:节点数, k:深度 void solve(){ int i, j, k;…
题目链接:51nod 1183 编辑距离 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; char a[N], b[N]; int dp[N][N];//dp[i][j]:a串的前i个字符转化成b串的前j个字符的最少操作数 int main(){ int i, j; scanf(, b+); ); ); ; i <= alen; ++i) dp[i][] =…
题目链接:51nod 1051 最大子矩阵和 实质是把最大子段和扩展到二维.读题注意m,n... #include<cstdio> #include<cstring> #include<vector> #include<algorithm> #define CLR(a,b) memset((a),(b),sizeof((a))) using namespace std; ; int dp[N][N]; int main(){ int n, m, i, j,…
题目链接:51nod 1043 幸运号码 题解:dp[i][j]表示 i 个数和为 j 的总数(包含0开头情况) dp[i][j] = dp[i-1][j-k] i & 1 :这里用滚动数组节省内存 非0开头的情况 * 0开头的情况:(dp[n&1][i]-dp[(n-1)&1][i]) *dp[n&1][i],最后将其累加即为结果. #include<cstdio> #include<algorithm> #include<cstring&g…
51nod 1021 石子归并 题解:从i到j合并的最小值:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]); 最后dp[1][n]即为所求结果. #include<cstdio> #include<algorithm> #include<cstring> #define CLR(a,b) memset((a),(b),sizeof((a))) using namespace std;…