题意:从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. input输入框限制只能输入数字

    js: function onlyNumber(event){     var keyCode = event.keyCode;     if((keyCode<48&&keyC ...

  2. table表格整体居中

    代码: <div style="text-align:center"> <table border="1" cellpadding=" ...

  3. Js 中那些 隐式转换

    曾经看到过这样一个代码:  (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = sb , 你敢相信, ...

  4. iOS开发 Error: CGImageProviderCreate: invalid image provider size

    一般可拉伸的图片(俗称点9图片)会放到images.xcassets目录里,然后对图片进行Slicing,但是当对一张图片进行slicing的left和right都是0的话,在iOS7.0上运行会出现 ...

  5. macOS Mojave 10.14 无法安装brew缺少Command Line Tools for Xcode的解决办法

    问题描述: 首先我的版本是 Xcode 10.1 如果按照以前的方法安装brew 复制 1 /usr/bin/ruby -e "$(curl -fsSL https://raw.github ...

  6. Oracle导入数据时出错ORA-39143:转储文件可能是原始的转储文件

    dmp文件是使用exp命令导出的,所以使用impdp导入则会报错误. 正确的导入语句为:imp sde/salis@orcl file='E:\sde.dmp' full=y;

  7. netframework webapi IogAttribute记录request参数和错误信息

    参考博客 https://www.cnblogs.com/hnsongbiao/p/7039666.html 书写LogFilterAttribute public class LogFilterAt ...

  8. android studio gradle国内代理设置

    android studio在开始都各项目之前都会遇到 gradle 的同步,而在同步过程中很多依赖下载特别慢甚至出现无法现在的情况,有的时候等的时间特别长,甚至要一天,关键是等了大半天之后突然报错, ...

  9. Servlet的入门案例

    编写入门案例 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行!! 3.1 servlet程序的class码拷贝 ...

  10. JDBC的工具类

    A: 抽取两个方法,一个获取Connection对象,一个是释放资源 import java.io.FileReader; import java.sql.Connection; import jav ...