最开始以为是贪心,不过写到一半发现不对,看了一下讨论,知道需要使用状态压缩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的更多相关文章

  1. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  2. 【BZOJ】1074: [SCOI2007]折纸origami

    http://www.lydsy.com/JudgeOnline/problem.php?id=1074 题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n ...

  3. 【HDOJ】【3506】Monkey Party

    DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...

  4. 【HDOJ】【3516】Tree Construction

    DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...

  5. 【HDOJ】【3480】Division

    DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...

  6. 【HDOJ】【2829】Lawrence

    DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...

  7. 【HDOJ】【3415】Max Sum of Max-K-sub-sequence

    DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...

  8. 【HDOJ】【3530】Subsequence

    DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...

  9. 【HDOJ】【3068】最长回文

    Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...

随机推荐

  1. ###Git使用问题

    #@date: 2014-05-04 #@author: gerui #@email: forgerui@gmail.com 一.git reset的使用 今天修改了代码,就git add ./,添加 ...

  2. 关于char 指针变量char *=p;这个语句的输出问题

    学习指针的时候我一直有个疑惑,请看下面的代码: #include <iostream> using std::cout; void main() { ; int *nPtr=&nu ...

  3. Php 的替代语法

    替代语法 为什么会有替代语法:     php是嵌入在html文档中的脚本语言,Php可以动态生成html标签,但是php主要功能并不是生成html标签,主要用于动态的生成数据(数据库中的数据).如果 ...

  4. ACE 6.2.0 RHEL6_Linux 编译

    第一步. 设置环境变量 export ACE_ROOT=$HOME/ace/ACE_wrappersexport LD_LIBRARY_PATH=$ACE_ROOT/ace:$ACE_ROOT/lib ...

  5. CentOS下shell显示-bash-4.1#不显示用户名路径的解决方法

    CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看到的username@hos ...

  6. hihocode 第九十二周 数论一·Miller-Rabin质数测试

    题目链接 检测n是否为素数,数据范围为2 <= n <= 10^18; 思路:Miller_Rabin素数检测模板题,原理:在Fetmat定理的基础之上,再利用二次探测定理: 对于任意的正 ...

  7. Ubuntu Vim YouCompleteMe 安装

    0. 必要工具安装 sudo apt-get install build-essential cmake 1. 安装 vundle mkdir ~/.vim/bundle git clone http ...

  8. log4j配置文件写法

    ### direct log messages to stdout ###log4j.rootLogger=DEBUG,stdoutlog4j.appender.stdout=org.apache.l ...

  9. 转载:PCB名詞解釋:通孔、盲孔、埋孔

    在[電子製造業]打滾多年,分享 SMT.焊錫.塑膠射出.產品設計.瓦楞包裝…等經驗.請注意文章內容不見得都正確,服用前請三思… 之前有網友提醒我有篇文章把PCB的盲孔(Blind hole).埋孔(B ...

  10. Memcache的部署和使用

    一.memcache简介 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力. Mem ...