最开始以为是贪心,不过写到一半发现不对,看了一下讨论,知道需要使用状态压缩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. C++例题练习(1)

    环境:Dev-C++( Version:5.6.1) 一.求2个或3个正整数中的最大数,用带有默认参数的函数实现 代码实现: #include <iostream> using names ...

  2. ###Maintainable C++

    点击查看Evernote原文. #@author: gr #@date: 2014-08-15 #@email: forgerui@gmail.com 记录一些标准规范.让自己的编码更可读,更可维护. ...

  3. lua package path 设置方法

    lua package path 设置方法: 添加环境变量LUA_PATH="/add_path/?.lua;;" 1.add_path为新添加的目录: 2.一定要添加双引号: 3 ...

  4. 我的第一个html页面

    <!DOCTYPE html><meta charset="UTF-8"><title>第一个html5界面</title>< ...

  5. 用分治法实现大数乘法,加法,减法(java实现)

    大数乘法即多项式乘法问题,求A(x)与B(x)的乘积C(x),朴素解法的复杂度O(n^2),基本思想是把多项式A(x)与B(x)写成 A(x)=a*x^m+b B(x)=c*x^m+d 其中a,b,c ...

  6. 结构型模式——Bridge(未完成)

    1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化.

  7. 实习笔记-3:ef实体操作错误篇

    学习笔记 1.json序列化ef实体是报错:“序列化类型为“System.Data.Entity.DynamicProxies.XXXX.... 对象时检测到循环引用.” 公司里用ef来生成实体.但是 ...

  8. Node.js:JavaScript脚本运行环境

    Node.js https://nodejs.org/ 2016-08-03

  9. php 加密解密方法

    <?php//可用于加密解密,如cookie,账号,手机号 as so on class DES { var $key; var $iv; //偏移量 function __construct( ...

  10. 51nod动态规划-----矩阵取数

    一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格. 1 3 3 2 1 3 2 2 1 能够获得的最 ...