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 ...
随机推荐
- react 修改state某一属性值
1.state // 筛选框相关数据 searchSelect: { term: { value: '学期', key: '', options: [] }, type_of_personnel: { ...
- PHP7+Nginx的配置与安装教程详解
下面脚本之家小编把PHP7+Nginx的配置与安装教程分享给大家,供大家参考,本文写的不好还请见谅. 系统环境:centos6.5 x64 软件版本:nginx-1.10.0 php-7.0.6 安装 ...
- 28 - 生成器交互-__slots__-未实现异常
目录 1 生成器交互 2 slots 3 未实现和未实现异常 4 Python的对象模型 1 生成器交互 生成器提供了一个send方法用于动态的和生成器对象进行交互.怎么理解的呢?看下面的例子: de ...
- 关于linux系统如何实现fork的研究(二)【转】
转自:http://www.aichengxu.com/linux/7166015.htm 本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 前一篇关于li ...
- python实战===python程序打包成exe
推荐PyInstaller项目www.pyinstaller.org 安装方法: 先跑pip install pywin32再跑pip install pyinstaller即可 可用一句命令打包 ...
- PHP 不让标准浏览器(firfox,chrome等)走浏览器的缓存页面
或在HTML页面里加: <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache,no-store, must-reva ...
- WPF之DataGrid--列的前台及后台实现
一.前台实现 在xaml里可以很轻松地实现一个如下图所示的DataGrid <StackPanel> <ComboBox Width="50" Horizonta ...
- Tutorial 6: ViewSets & Routers
转载自:http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/ Tutorial 6: ViewSets & ...
- nginx同域名动静态分离
公司需求是如果是app加载静态页面的话要通过应用服务直接请求指定的服务 由于机房迁移 不得不将该文件迁移到一个指定的地方 需要通过nginx配置检测到是访问该静态页面的就转到该静态页面上面进行加 ...
- C#窗口矩形区域着色
C#写的一个GUI窗口,有几百个矩形区域.每个矩形区域的颜色随时都可能改变,并且多次改变. 我放弃使用label绘制矩形,因为效果不好.拖控件的界面使用power packs中的rectanglesh ...