HDU 1074 Doing Homework ——(状态压缩DP)
2024-09-09 06:29:52
考虑到n只有15,那么状压DP即可。
题目要求说输出字典序最小的答案的顺序,又考虑到题目给出的字符串本身字典序是递增的,那么枚举i的时候倒着来即可。因为在同样完成的情况下,后选字典序大的,小的字典序就会在前面,那么整体的字典序就会更小。代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <string>
#include <iostream>
#include <stack>
using namespace std;
const int inf = 0x3f3f3f3f; struct node
{
string name;
int cost,deadline;
}a[];
struct state
{
int pre,now;
int t,score;
}dp[<<]; int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=;i<n;i++) cin >> a[i].name >> a[i].deadline >> a[i].cost;
int all = << n;
for(int mask=;mask<all;mask++)
{
dp[mask].score = inf;
for(int i=n-;i>=;i--)
{
if(mask & (<<i))
{
int pre = mask - (<<i);
int add = dp[pre].t + a[i].cost - a[i].deadline;
if(add < ) add = ;
if(dp[pre].score + add < dp[mask].score)
{
dp[mask].score = dp[pre].score + add;
dp[mask].pre = pre;
dp[mask].now = i;
dp[mask].t = dp[pre].t + a[i].cost;
}
}
}
}
int temp = all - ;
printf("%d\n",dp[temp].score);
stack<int> S;
while(temp)
{
S.push(dp[temp].now);
temp = dp[temp].pre;
}
while(!S.empty())
{
int x = S.top(); S.pop();
cout << a[x].name << endl;
}
}
return ;
}
最新文章
- 扩展GridView实现的一个自定义无刷新分页,排序,支持多种数据源的控件TwfGridView
- zookeeper集群管理配置优化总结
- 如何把一个excel工作薄中N个工作表复制到另一个工作薄中
- 深入理解java虚拟机【Java虚拟机垃圾收集器】
- Leetcode: Self Crossing
- asp.net dropdownlist和listbox
- Web系统大规模并发----电商秒杀与抢购
- UWP入门一 7天酒店客户端源码及说明
- PYTHON---FILE IO
- Wow! Such Doge! - HDU 4847 (水题)
- Android-transulcent-status-bar
- 垃圾回收GC——JVM之七
- birkenfeld / sphinx-contrib — Bitbucket
- solr6.6教程-基础环境搭建(二)
- 文件服务器的详细配置之共享权限与NTFS权限的设置
- 一步步建立 Vue + Cesium 初始化项目
- python之做一个简易的翻译器(一)
- object detection[rfcn]
- Opencv画图操作
- BZOJ.4650.[NOI2016]优秀的拆分(后缀数组 思路)
热门文章
- .net core +gogs + jenkins +docker自动化发布、部署
- sftp配置多个用户权限的问题
- 微信小程序wx:key以及wx:key="; *this";详解:
- For... in 及 For… of 及 forEach
- printPreviewControl1怎么刷新文档
- [LeetCode] 17. 电话号码的字母组合 ☆☆☆(回溯) ###
- json —— pickle 的序列化和反序列化
- MFC编程——Where is WinMain?
- 共用dll如何扩展
- 动态规划1——最长递增子序列、最长公共子序列、最长公共子串(python实现)