bzoj1003 trans DP
最初的印象是网络流之类的东西,但好像不是。
想了一下,没什么思路,就网上看了一下,有人说是DP,然后就自己想DP的做法,最开始想的状态是:dp[n][s] 第n天走s这条路,前n天最小的代价,但发现路径不好表示,并且m=20时s最大就是10^6级别了,所以放弃了这个状态。
打开题解,发现题解的状态不需要记录s,即dp[n]表示前n天最小的代价和,然后用一个辅助数组mdis[i][j]表示从第i天到第j天所有限制共同作用下的图的最短路。转移:
dp[i] = min( mdis[1][i]*i, dp[j]+mdis[j+1][i]*(i-j)+K | j in [1,i) }
的确很好,也很自然(对于一个最优解,必定是由一些“路径改变点”组成,而两个“路径改变点"之间走的一定是满足该区间限制下的最短路,我们每次只需要枚举最后一个路径改变点,就可以转移了)。有点像一个多决策问题(对于每一天,决策是改变或不改变路径)。
/**************************************************************
Problem: 1003
User: idy002
Language: C++
Result: Accepted
Time:28 ms
Memory:860 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#define maxn 110
#define maxm 25
#define inf 0x3f3f3f3f
using namespace std; int n, m, e, K; vector<int> g[maxm], wght[maxm];
bool gave[maxm][maxn];
bool cave[maxm]; int mdis[maxn][maxn];
int dis[maxm];
bool done[maxm];
int dp[maxn]; void input() {
scanf( "%d%d%d%d", &n, &m, &K, &e );
for( int i=,u,v,w; i<=e; i++ ) {
scanf( "%d%d%d", &u, &v, &w );
g[u].push_back(v);
g[v].push_back(u);
wght[u].push_back(w);
wght[v].push_back(w);
}
memset( gave, , sizeof(gave) );
int d;
scanf( "%d", &d );
for( int i=,u,a,b; i<=d; i++ ) {
scanf( "%d%d%d", &u, &a, &b );
for( int i=a; i<=b; i++ )
gave[u][i] = false;
}
} struct Stat {
int u, dis;
Stat( int u, int dis ):u(u),dis(dis){}
bool operator<( const Stat & b ) const {
return dis>b.dis;
}
};
int dijstra( int s, int d ) {
priority_queue<Stat> hp;
memset( done, false, sizeof(done) );
memset( dis, 0x3f, sizeof(dis) );
dis[s] = ;
hp.push( Stat(s,) );
while( !hp.empty() ) {
int u = hp.top().u;
hp.pop();
if( done[u] ) continue;
done[u] = true;
if( u==d ) return dis[d];
for( int t=; t<g[u].size(); t++ ) {
int v = g[u][t];
int w = wght[u][t];
if( !cave[v] ) continue;
if( dis[v]>dis[u]+w ) {
dis[v]=dis[u]+w;
hp.push( Stat(v,dis[v]) );
}
}
}
return inf;
}
void prep() {
memset( mdis, 0x3f, sizeof(mdis) );
for( int i=; i<=n; i++ ) {
memset( cave, , sizeof(cave) );
for( int j=i; j<=n; j++ ) {
for( int u=; u<=m; u++ )
cave[u] &= gave[u][j];
mdis[i][j] = dijstra(,m);
}
}
}
void work() {
for( int i=; i<=n; i++ ) {
if( mdis[][i]!=inf )
dp[i] = mdis[][i]*i;
else dp[i]=inf;
for( int j=; j<i; j++ )
if( mdis[j+][i]!=inf )
dp[i] = min( dp[i], dp[j]+mdis[j+][i]*(i-j)+K );
}
printf( "%d\n", dp[n] );
}
int main() {
input();
prep();
work();
}
bzoj1003 trans DP的更多相关文章
- BZOJ 1003: [ZJOI2006]物流运输trans DP+最短路
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]
3163: [Heoi2013]Eden的新背包问题 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 428 Solved: 277[Submit][ ...
- P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)
P3193 [HNOI2008]GT考试 思路: 设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为: \[dp(i,j)=dp ...
- bzoj题解汇总(1001-1016)
bzoj1001: 平面图网络流. 注意只有一行或者一列的情况. bzoj1002: 待定系数法求解递归式.或者用MatrixTree+行列式直接推导. 然后来个高精度. bzoj1003: dp+最 ...
- BZOJ ac100题存档
不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...
- 解题:WC 2018 州区划分
题面 WC之前写的,补一补,但是基本就是学新知识了 首先可以枚举子集$3^n$转移,优化是额外记录每个集合选取的个数,然后按照选取个数从小到大转移.转移的时候先FWT成“点值”转移完了IFWT回去乘逆 ...
- poj1722 SUBTRACT
应该是基础的dp练手题 线性dp最主要的就是关于阶段的划分,这个题中我没想到的一点就是开状态的时候使用了前i个数能合成的数来记录 我自己的想法就是类似于区间dp这样的记录方法,这种方法确实开了很多冗余 ...
- BZOJ 1~10 精简题解
从这星期起,我开始了怒刷BZOJ的旅程.这几天刷了10道题(由于"档期"的原因,所以有几道题没打完-..捂脸--..) 精简题解: 1000 A+B Problem --.. [B ...
- BZOJ-1003 物流运输trans SPFA+DP
傻逼错误耗我1h,没给全范围坑我1A.... 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MB Submit: 529 ...
随机推荐
- 如何写出优雅的js以及js特殊技巧
由于代码和解释都写在了github的readme内部,这里就直接附上github:https://github.com/jiangzhenfei/pretty-js/tree/master
- 带你优雅的使用 icon
前言 本篇文章其实陆陆续续写了快半年,主体部分写好了很久了,但由于种种原因一直没有发布.首先来说说写这篇文章的主要初衷是:在做前端后台项目的时候经常会用到很多 icon 图标,刚开始还好,但随着项目的 ...
- c语言学习笔记.条件编译.#if,#ifdef,if的区别
最近遇到了,以此做个记录. 条件编译 是C预处理部分的内容. 其判断语句包括 #if #else if #else 以及 #ifdef 和 #endif. 使用 #if (表达式) codes1. ...
- Lithium中关键特性更新
Lithium中关键特性更新 1. Lithium特性更新概述 Lithium相对于Helium更新特性共27项,其中原有特性提升或增强13项,新增特性14项,如下表所示 特性类型 相对于Helium ...
- struts的标签
<%@ taglib uri="/struts-tags" prefix="s"%> <%@ taglib uri="/WEB-IN ...
- ogg数据初始化历程记录
之前,源端数据表结构发生改变,不知道前面的同事是怎么搞得(生成的数据定义文件不对,还是没有把进程启动),造成进程停止20天,然后重启复制进程,对比源端和目标端数据有差异(总共差10000多条数据),问 ...
- PHP对象4: final 不允许重写方法或不允许继承类
final用在方法中,能继承方法, 不允许重写方法 final用在类声名中, 此类就不能继承 <?php class A{ final function say(){ say 'Ok<br ...
- python基础===100盏灯的问题
闪存里有人这样提问这样: 第一轮操作所有电灯,第二轮操作第2盏,第4盏开关,以此类推,第三轮改变编号为3的倍数的电灯,第3盏,第6盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,就点亮它,以此类推 ...
- static变量和final变量
1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: 对于静态变量在内 ...
- Linux软件管理器(如何使用软件管理器来管理软件)2---安装及管理Linux应用程序
安装及管理Linux应用程序 Linux应用程序的组成1.普通的可执行程序文件,一般保存在/usr/bin目录中,普通用户即可执行.2.服务器程序.管理程序文件,一般保存在/usr/sbin目录中,需 ...