51nod 1636 教育改革 | DP

题面

最近A学校正在实施教育改革。

一个学年由n天组成。A学校有m门课程,每天学生必须学习一门课,一门课程必须在一天内学习完。在学习完第i门课程后,学生们会收到 xi 个家庭作业,其中 xi是区间[ai,bi]里的一个整数 。每门课还有一个属性,就是复杂度 ci 。A学校现在要制他们的课程表,具体要求如下:

·在课程表中,随着天数的增加,课程的复杂度是严格递增的。

·除了第1天,每天的作业量必须是前一天的k倍,或者比前一天多k个作业。(假设第i天的作业量为 xi ,则对于i(1<i≤n)到满足 xi = k+xi−1 或 xi = k·xi−1 );

现在,给定天数n,系数k,和m门课程的ai,bi,ci(1≤i≤m)。要求计算一个学年可以安排最大的总作业量( 总作业量的表达式是∑ni=1xi )是多少。

Input

单组测试数据

第一行,三个由空格隔开的整数n,m,k(1≤n≤m≤50,1≤k≤100),表示一个学年的天数,课程的数量,和作业增量系数。

接下来的m行,

每行有三个整数,ai,bi,ci(1≤ai≤bi≤10^16,bi-ai≤100,1≤ci≤100)

分别表示第i门课程的最小作业量,和最多作业量,以及复杂度。

不同的课程可以有相同的复杂度。课程编号从1到m。

Output

如果有可行方案,第一行输出“YES”(没有引号),第二行输出最大的作业量。

如果没有可行方案,则输出一行“NO”(没有引号)。

题解

这教育改革怎么越改作业越多2333

dp[i][j][k]表示第i天上j课,当天作业量是k的最大答案

——但是这样显然是不行的因为k太大。

好在虽然k大,k与该课程j作业量的左端点的差不会很大。

那么就让dp[i][j][k]表示第i天上j课,当天作业量是a[j]+k(a的意义如题所述)。然后就可以愉快地转移了!

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
} const int N = 103, M = 203;
int n, m, K;
ll dp[N][N][M], ans;
struct Lesson {
int c;
ll l, r;
bool operator < (const Lesson b) const{
return c < b.c;
}
} a[N]; int main(){ read(n), read(m), read(K);
for(int i = 1; i <= m; i++)
read(a[i].l), read(a[i].r), read(a[i].c);
sort(a + 1, a + m + 1);
memset(dp, -1, sizeof(dp)); for(int j = 1; j <= m; j++)
for(ll k = a[j].l; k <= a[j].r; k++)
dp[1][j][k - a[j].l] = k; for(int i = 2; i <= n; i++)
for(int j = 1; j <= m; j++)
for(ll k = a[j].l; k <= a[j].r; k++)
for(int h = 1; a[h].c < a[j].c; h++){
if(k >= K){
ll k1 = k - K;
if(k1 >= a[h].l && k1 <= a[h].r && dp[i - 1][h][k1 - a[h].l] != -1)
dp[i][j][k - a[j].l] = max(dp[i][j][k - a[j].l], dp[i - 1][h][k1 - a[h].l] + k);
}
if(k % K == 0){
ll k2 = k / K;
if(k2 >= a[h].l && k2 <= a[h].r && dp[i - 1][h][k2 - a[h].l] != -1)
dp[i][j][k - a[j].l] = max(dp[i][j][k - a[j].l], dp[i - 1][h][k2 - a[h].l] + k);
}
}
for(int j = 1; j <= m; j++)
for(ll k = a[j].l; k <= a[j].r; k++)
ans = max(ans, dp[n][j][k - a[j].l]); if(ans) puts("YES"), write(ans), putchar('\n');
else puts("NO"); return 0;
}

51nod 1636 教育改革 | DP的更多相关文章

  1. 51 Nod 1636 教育改革(dp)

    1636 教育改革  题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 最近A学校正在实施教育改革. 一个学年由n天 ...

  2. 51nod 1636 教育改革

    题目链接 令f[i][j][k]为第i天选择的课程为j,设置作业为a[j]+k时的最大作业量. 那么f[i][j][k]可以由哪些状态转移而来?先把课程按复杂度排序,那么可以转移来的课程是f[i-1] ...

  3. 51nod 1636

    1636 教育改革 我看过题解了还下了数据,表示很惭愧不想说什么,但还是说两句吧 sol: 因为差值很小只有100,所以对数组下标存的是(选择的数值和左端点的差值) f[i][j][k]即为第i天选了 ...

  4. 51nod 1353 树 | 树形DP经典题!

    51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...

  5. 51nod 1021 石子归并(dp)

    51nod 1021 石子归并 题解:从i到j合并的最小值:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]); 最 ...

  6. 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...

  7. 51nod 1406 位运算/dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制: ...

  8. 51NOD 1202 子序列个数 DP

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1202&judgeId=225600 这题看起来挺复杂,但是真正的 ...

  9. 51Nod 1327 棋盘游戏 —— 延迟DP

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1327 看博客:https://www.cnblogs.com/Na ...

随机推荐

  1. Kickstart Round H 2018

    打了ks好久都没有更新 诶,自己的粗心真的是没救了,A题大数据都能错 A #include <iostream> #include <cstdio> #include < ...

  2. jar包冲突常用的解决方法

    jar包冲突常见的异常为找不到类(java.lang.ClassNotFoundException).找不到具体方法(java.lang.NoSuchMethodError).字段错误( java.l ...

  3. SICP读书笔记 2.1

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  4. DQL、DML、DDL、DCL全名是啥?

    SQL(Structure Query Language)结构化查询语言 DQL(data query language)数据查询语言 select操作 DML(data manipulation l ...

  5. 方正 ignb路由器设置备份(自用笔记)

    192.168.15.96255.255.255.0192.168.15.1219.232.46.61219.141.136.10

  6. 前端_CSS

    目录 CSS语法 CSS的四种引入方式 CSS选择器 CSS属性操作 补充 示例(一些小模板) CSS语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 1 2 3 4 5 6 7 ...

  7. oracle varchar2改成大字段类型clob,读取大字段内容

    http://blog.csdn.net/cai7095576/article/details/23999549

  8. 王者荣耀交流协会final发布第四次scrum例会

    1.例会照片 成员高远博,冉华,王磊,王玉玲,任思佳,袁玥,王磊,王超同学因参加比赛不在学校,不能出席. master:王玉玲 2.时间跨度 2017年12月4日 18:00 — 18:18,总计18 ...

  9. spring boot之创建web项目并访问jsp页面

    1,创建spring boot的web项目 刚创建好的项目路径如下: 2,pom中要有下面的依赖 <dependency> <groupId>org.springframewo ...

  10. 09慕课网《进击Node.js基础(一)》HTTP-get/request

    get是对request封装 可以在后台发起http请求,获取远程资源,更新或者同步远程资源 http.request(options[,callback]) 以下代码灌水失败: var http = ...