题意:从m门课选出n个排到n天,每天一门,难度须递增,每门课对应着一个作业量Xi,且Xi = Xi-1 + k or Xi - Xi-1 * k,总作业量要尽可能大,问能否排布,若能排布,求方案。

思路:比赛时企图用DFS暴搜,无奈超时,尝试各种优化都没成功,赛后看了题解才知道是DP,同时也发现很多时候能用搜索解决的题目如果用DP会省下很多时间!

  建立一个三维DP数组,dp[i][j][k],i表示第i天,j表示第i天时排了第j门课,k表示选择的作业量为第j门课作业区间的左端点+k。需要注意的地方是还应建立pre数组来标记DP路径。

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std; struct subject{
long long a,b;
int c,id;
bool operator<(subject& t){
return c<t.c;
}
}arr[];
struct route{
int addition,id;
route(){}
route(int x,int y):id(x),addition(y){}
}pre[][][],ending; int n,m,k;
long long dp[][][];//day/num/work bool makeDp(){
memset(dp,-,sizeof(dp));
for(int j=;j<=m;j++)
for(long long i=arr[j].a;i<=arr[j].b;i++){
dp[][j][i-arr[j].a]=i;
}
for(int i=;i<n;i++){
for(int j=i;j<=m&&m-j>=n-i;j++){
for(long long kk=arr[j].a;kk<=arr[j].b;kk++){
if(dp[i][j][kk-arr[j].a]==-)
continue;
for(int jj=j+;jj<=m;jj++){
if(arr[jj].c==arr[j].c)
continue;
if(k*kk>=arr[jj].a&&k*kk<=arr[jj].b){
if(dp[i+][jj][k*kk-arr[jj].a]<dp[i][j][kk-arr[j].a]+k*kk){
dp[i+][jj][k*kk-arr[jj].a]=dp[i][j][kk-arr[j].a]+k*kk;
pre[i+][jj][k*kk-arr[jj].a]=route(j,kk-arr[j].a);
}
}
if(k+kk>=arr[jj].a&&k+kk<=arr[jj].b){
if(dp[i+][jj][k+kk-arr[jj].a]<dp[i][j][kk-arr[j].a]+k+kk){
dp[i+][jj][k+kk-arr[jj].a]=dp[i][j][kk-arr[j].a]+k+kk;
pre[i+][jj][k+kk-arr[jj].a]=route(j,kk-arr[j].a);
}
}
}
}
}
}
long long flag=-;
for(int i=n;i<=m;i++){
for(long long j=arr[i].a;j<=arr[i].b;j++){
if(flag<dp[n][i][j-arr[i].a]){
flag=dp[n][i][j-arr[i].a];
ending=route(i,j-arr[i].a);
}
}
}
if(flag!=-)
return true;
return false;
} void findAns(bool x){
if(!x)
cout<<"NO";
else {
cout<<"YES\n";
vector<route> ans;
route ha=ending;
for(int i=n;i>=;i--){
ans.push_back(ha);
ha=pre[i][ha.id][ha.addition];
}
for(int i=n-;i>=;i--){
cout<<arr[ans[i].id].id<<" "<<arr[ans[i].id].a+ans[i].addition<<endl;
}
}
} int main(){
cin>>n>>m>>k;
for(int i=;i<=m;i++){
cin>>arr[i].a>>arr[i].b>>arr[i].c;
arr[i].id=i;
}
sort(arr+,arr++m);
findAns(makeDp());
return ;
}

By xxmlala

Education Reform(CodeForces-119C)【DP】的更多相关文章

  1. CodeForces 106C 【DP】

    题意: n g dough  m种商品? 每种有ai stuffing, 拿bi stuffing + ci dough -> di tugriks rest c0 dough -> d0 ...

  2. CodeForces 761C 【DP】

    总结:能这么DP就这么写! 多练位运算标记. #include<bits/stdc++.h> using namespace::std; const int N=55; const int ...

  3. Codeforces 358D【DP】

    思路:  dp[i][0] 代表取的时候左边没有 dp[i][1] 代表取的时候右边没有 dp[i][2] 代表取的时候左右都没有 dp[i][3] 代表取的时候左右都有 然后自己转移吧= =. 注意 ...

  4. CodeForces 13C【DP】

    题意: 给你n个数,每次只能让一个数+1,或者-1,目标是最终使这个序列构成一个非递减的序列: n是5e3,复杂度n^2内.值是1e9: 思路: 可以发现子结构是保证一个区间的非递减, 如果只是dp[ ...

  5. CodeForces 687C【DP】

    题意: 给你n个数,然后让这些数相加组合,然后在这些组合的数里可以再相加组合搞出给定 k,输出这些组合的数. 思路: DP. //在枚举到第i个coin的时,dp[i][j],i 肯定能被a[i]组合 ...

  6. CodeForces 429B【dp】

    题意: 在一个n*m的矩阵中有两只虫子,一只从左上角向右下角移动,另外一只从左下角向右上角移动. 要求: 1.第一只虫子每次只能向左或者向下移动一格,另外一只只能向上或者向右移动一格. 2.两只虫子的 ...

  7. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

  8. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  9. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  10. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

随机推荐

  1. python 识别图片中的汉字

    我们就识别上面的汉字. 安装软件tesseract和python库 https://www.cnblogs.com/sea-stream/p/10961580.html 然后新建一个文件夹test,把 ...

  2. [python]函数默认参数顺序问题

    python 函数参数定义有四类: 1.必选参数:调用函数时候必须赋值的参数. a,须以正确的顺序传入函数b,调用时的数量必须和声明时的一样 def exa(x): return x #b作为参数进入 ...

  3. MONGODB 数据库回复备份

    1.导出工具:mongoexport     1.概念:         mongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件.可以通过参数指 ...

  4. java试题复盘——11月25日

    上: 11.下列表述错误的是?(D) A.int是基本类型,直接存数值,Integer是对象,用一个引用指向这个对象. B.在子类构造方法中使用super()显示调用父类的构造方法,super()必须 ...

  5. servlet容器:jetty,Tomcat,JBoss

    一.几款servlet容器对比:jetty,Tomcat,JBoss 二.JBOSS相关问题解决 1.JBOSS下载安装 2.处理jboss-as-7.1.1.Final与jdk1.8及1.8以上版本 ...

  6. DockerFile体系结构(保留字指令)

    1.FROM --基础镜像,当前新镜像是基于那个镜像的 2.MAINTAINER --镜像维护者的姓名和邮箱地址 3.RUN --容器构建时需要运行的指令 4.EXPOSE --当前容器对外暴露出的端 ...

  7. 冲刺阶段——Day2

    [今日进展] 完成黄金点游戏的算法与代码架构. 使用文字界面完成任务 码云链接:https://gitee.com/jxxydwt1999/20175215-java/blob/master/Gold ...

  8. postgresql interval 字段拼接

    无拼接时: SELECT scan_time + '5 day' FROM tbl_temp_record SELECT scan_time + '-5 day' FROM tbl_temp_reco ...

  9. insmod mknod

    insmod module 會在 /proc/devices/ 下產生 major number 及 device name ---------------------------- mknod 會使 ...

  10. <iframe>和<frame>标签属性详解

    iframe>元素会创建包含另外一个文档的内联框架(即行内框架): 一.align 属性(不赞成) align属性规定iframe相对于周围元素的水平和垂直对齐方式,因为iframe元素是行内元 ...