最初的印象是网络流之类的东西,但好像不是。

想了一下,没什么思路,就网上看了一下,有人说是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的更多相关文章

  1. BZOJ 1003: [ZJOI2006]物流运输trans DP+最短路

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  2. BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]

    3163: [Heoi2013]Eden的新背包问题 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 428  Solved: 277[Submit][ ...

  3. P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)

    P3193 [HNOI2008]GT考试 思路: 设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为: \[dp(i,j)=dp ...

  4. bzoj题解汇总(1001-1016)

    bzoj1001: 平面图网络流. 注意只有一行或者一列的情况. bzoj1002: 待定系数法求解递归式.或者用MatrixTree+行列式直接推导. 然后来个高精度. bzoj1003: dp+最 ...

  5. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  6. 解题:WC 2018 州区划分

    题面 WC之前写的,补一补,但是基本就是学新知识了 首先可以枚举子集$3^n$转移,优化是额外记录每个集合选取的个数,然后按照选取个数从小到大转移.转移的时候先FWT成“点值”转移完了IFWT回去乘逆 ...

  7. poj1722 SUBTRACT

    应该是基础的dp练手题 线性dp最主要的就是关于阶段的划分,这个题中我没想到的一点就是开状态的时候使用了前i个数能合成的数来记录 我自己的想法就是类似于区间dp这样的记录方法,这种方法确实开了很多冗余 ...

  8. BZOJ 1~10 精简题解

    从这星期起,我开始了怒刷BZOJ的旅程.这几天刷了10道题(由于"档期"的原因,所以有几道题没打完-..捂脸--..) 精简题解: 1000 A+B Problem --.. [B ...

  9. BZOJ-1003 物流运输trans SPFA+DP

    傻逼错误耗我1h,没给全范围坑我1A.... 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MB Submit: 529 ...

随机推荐

  1. 天梯赛 L2-001 紧急救援 (最短路 dij)

    作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...

  2. 可能是是最全的Springboot基础视频分享,告别无视频可学

    一头扎进SpringBoot视频教程 SpringBoot入门 2017年-张志君老师-SpringBoot(新增) 欢迎关注我的微信公众号:"Java面试通关手册" 回复关键字& ...

  3. 使用qt写的简单的图片浏览器

    功能特别简单,支持png,jpg,bmp,gif文件,支持自适应窗口大小,支持放大缩小,旋转功能还有点问题,支持上下按键选择图片 因为初学qt,所以很多东西都不太会,而且c++学的不是太好,没有怎么使 ...

  4. Ubuntu 17.10 用 apt 搭建 lamp 环境、安装 phpmyadmin、redis 服务+扩展、mysql 扩展、开启错误提示、配置虚拟主机

    2018-02-24 13:50:30 更新: 个人喜欢相对原生又不太麻烦,所以用 apt 构建环境.不过,最近使用到现在记得出现过了 3 次 apache 或 mysql 服务器无法启动或无法连接的 ...

  5. ASP.NET中的状态保持

    1.ASP.NET中的状态保持解决方案 2.常用的状态报保持方式 view state  ASP.Net的.aspx页面特有,页面级的,就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式(b ...

  6. geoserver-manager发布style失败

    当参数给定没有错误时,最有可能的原因就是: sld文件格式应该以UTF-8无BOM格式编码(自己生成的sld文件多数情况下是以UTF-8格式编码).

  7. LightOJ 1323 Billiard Balls(找规律(蚂蚁爬木棍))

    题目链接:https://vjudge.net/contest/28079#problem/M 题目大意: 一个边界长为L宽为W的平面同时发射n个台球,运动K秒,台球碰到桌面及两(多)个台球相撞情况如 ...

  8. 爬虫基础库之beautifulsoup的简单使用

    beautifulsoup的简单使用 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: ''' Beautiful Soup提供一些简单的.p ...

  9. MySql学习笔记——触发器

    今天又学习了一下mysql触发器的相关知识,对此做了一些笔记和总结. 定义及作用 触发器是一个被指定关联到一个表的数据对象,触发器不需要调用,当对一个表的特别事件出现时,它就会被激活.触发器的代码也是 ...

  10. Python 一些 实用的包(持续更新)

    line_profiler:(代码性能分析) 使用方法:链接 codecs:(Python内置的编码库) 数据分析与挖掘领域: 引自博客:这里     因为他有很多这个领域相关的库可以用,而且很好用, ...