【HDOJ】1074 Doing Homework
最开始以为是贪心,不过写到一半发现不对,看了一下讨论,知道需要使用状态压缩DP,现在还没有使用深搜实现(据说可以)晚上实现一下,道理应该是类似的。前面做八数码,至今未果,就说需要状态压缩。这个太神奇了,因为题目的数据量为15,所以采用移位压缩。即100代表第三个(注意index)的转台为完成。RE了很多次,才发现异或后求得的不是index。。。而且原来的输入数据本身就是字典序,不需要再strcmp,就一直RE在那个if了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define MAXNUM 16
#define MAXDP 1<<15 typedef struct {
int pre;
int reduce;
int complete;
} dp_st; dp_st dps[MAXDP];
char visit[MAXDP];
char stack[MAXNUM][]; typedef struct {
char name[];
int dead, need;
} homework_st; homework_st homeworks[MAXNUM]; void printCourse(int end) {
int top=, now=end, id, tmp; while (now) {
id = now ^ dps[now].pre;
tmp = ;
while (id) {
id = id>>;
++tmp;
}
strcpy(stack[top++], homeworks[tmp-].name);
now = dps[now].pre;
} while (top) {
--top;
printf("%s\n", stack[top]);
}
} int main() {
int case_n, n, len;
int i, j, k, code, tmp, complete, reduce;
//FILE *fout = fopen("data", "w"); scanf("%d", &case_n); while (case_n--) {
scanf("%d%*c", &n);
for (i=; i<n; ++i)
scanf("%s %d %d", homeworks[i].name, &homeworks[i].dead, &homeworks[i].need);
memset(visit, , sizeof(visit));
len = <<n;
dps[].pre = -;
dps[].reduce = ;
dps[].complete = ;
visit[] = ;
// 0~len-1
for (i=; i<len-; ++i) {
for (j=; j<n; ++j) {
code = <<j;
// code is not done
if ((i&code) == ) {
k = i|code;
complete = dps[i].complete + homeworks[j].need;
tmp = complete - homeworks[j].dead;
if (tmp < )
tmp = ;
reduce = dps[i].reduce + tmp;
if ( visit[k] ) {
if (reduce < dps[k].reduce) {
dps[k].reduce = reduce;
dps[k].complete = complete;
dps[k].pre = i;
}
/* No need and tmp need to while(){>>1} again
else if (reduce == dps[k].reduce){
tmp = dps[k].pre ^ k;
if (strcmp(homeworks[j].name, homeworks[tmp].name) < 0) {
dps[k].reduce = reduce;
dps[k].complete = complete;
dps[k].pre = i;
}
}*/
} else {
visit[k] = ;
dps[k].reduce = reduce;
dps[k].complete = complete;
dps[k].pre = i;
}
}
}
}
/*
for (i=0; i<len; ++i)
fprintf(fout, "%d: pre=%d,reduce=%d,complete=%d\n", i,dps[i].pre,dps[i].reduce,dps[i].complete);
*/
printf("%d\n", dps[len-].reduce);
printCourse(len-);
} //fclose(fout);
return ;
}
【HDOJ】1074 Doing Homework的更多相关文章
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【BZOJ】1074: [SCOI2007]折纸origami
http://www.lydsy.com/JudgeOnline/problem.php?id=1074 题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n ...
- 【HDOJ】【3506】Monkey Party
DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...
- 【HDOJ】【3516】Tree Construction
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...
- 【HDOJ】【3480】Division
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...
- 【HDOJ】【2829】Lawrence
DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...
- 【HDOJ】【3415】Max Sum of Max-K-sub-sequence
DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...
- 【HDOJ】【3530】Subsequence
DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...
- 【HDOJ】【3068】最长回文
Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...
随机推荐
- WCF与Web API 区别(应用场景)
Web api 主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作 请求的回 ...
- GCD 多线程
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统.它是一个在线程池模式的基础上执行的 ...
- OpenJudge 2694 逆波兰表达式
1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...
- A Case for Flash Memory SSD in Enterprise Database Applications
通过分析固态硬盘的特性对数据库中不同对象,如:表,索引,回滚段,重做日志等的应用进行具体研究,最后将数据库中不同的对象进行区别应用
- Oracle if else if for case
------------------游标+for+if else if DECLARE cursor s_cursor is SELECT * from emp;--定义游标 begin for r ...
- 浅谈MVC、MVP、MVVM架构模式的区别和联系
MVC.MVP.MVVM这些模式是为了解决开发过程中的实际问题而提出来的,目前作为主流的几种架构模式而被广泛使用. 一.MVC(Model-View-Controller) MVC是比较直观的架构模式 ...
- C# Form窗体子窗口关闭时刷新父窗体中的datagridview
解决该问题可以用委托,但是还有更简单方便的两种方法: 方法一:将主窗体实例保存到子窗体 show form2的时候设置一下 owner为form1 Form2 f2 = new Form2(); / ...
- linux下tomcat的安装
本文主要内容: (1)安装apr,这是 Apache 为了提升 Tomcat 的性能搞的一套本地化 Socket, Thread, IO 组件也就是说它有高级 IO 功能, 操作系统级别的功能调用, ...
- python学习_应用pickle模块封装和拆封数据对象
学习文件数据处理的时候了解到有pickle模块,查找官方文档学习了一些需要用到的pickle内容. 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节 ...
- opengl Test
LIBS += -lGL -lGLU -lglut -lGLEW #include <GL/glut.h> #include <iostream> using namespac ...