HDU - 4511 小明系列故事——女友的考验(AC自动机+dp)
题目链接:点击查看
题目大意:小明在点 1 而小明的女朋友在点 n ,现在小明要去找女朋友,满足以下两个条件:
- 途径的序号满足严格递增
- 小明的女朋友给小明提出了 m 条路径是不允许走的
在满足上述两条规则的情况下,路径需要尽可能的短,输出最短路径,如果无解,输出Can not be reached!
题目分析:因为是在刷AC自动机的时候碰到的这个题目,而看到有 m 条路径是不允许走的,一下子就敏感起来了,可以先用AC自动机将这 m 条不允许走的路径标记一下,在更新 fail 指针的时候同时向下传递一下这个状态,根据更新好的状态 dp 就好了,因为数据比较小,允许开一个二维dp[ i ][ j ],表示到了第 i 个点,状态为 j 时的最小路径,然后直接转移就好了,对于dp比较好的同学来说剩下的可能就是一道简单题了,但我还是比较菜,稍微总结一下
因为没有掌握好自己定义dp的状态,在转移时找不到下一个状态该怎么转移,最后发现两重循环枚举起点和终点就好了,因为这个题目要求的并不是每次只能添加一个字符,题目也明确说明了只要满足途径序号严格递增就好,如果从点 1 到点 n 的路径最短,那么直接过去也不是不可以的
还有一个就是边界问题,初始化的时候我的做法是 dp[ 1 ][ 0 ] = 0,其余为 inf ,而正解是将 dp[ 1 ][ trie[ 0 ][ 1 ] ] = 0,其余为 inf ,这个还是需要多加注意的
剩下的直接转移就好了
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=510;const double eps=1e-8;int fail[N],pos[N],trie[N][60],cnt,n,m;bool vis[N];void insert_word(int len)
{int pos=0;for(int i=0;i<len;i++){int to;scanf("%d",&to);if(!trie[pos][to])trie[pos][to]=++cnt;pos=trie[pos][to];}vis[pos]=true;
}void getfail()
{queue<int>q;for(int i=1;i<=n;i++){if(trie[0][i]){fail[trie[0][i]]=0;q.push(trie[0][i]);}}while(!q.empty()){int cur=q.front();q.pop();if(vis[fail[cur]])vis[cur]=true;for(int i=1;i<=n;i++){if(trie[cur][i]){fail[trie[cur][i]]=trie[fail[cur]][i];q.push(trie[cur][i]);}elsetrie[cur][i]=trie[fail[cur]][i];}}
}void init()
{cnt=0;memset(vis,false,sizeof(vis));memset(trie,0,sizeof(trie));
}struct Point
{double x,y;void input(){scanf("%lf%lf",&x,&y);}friend double dis(Point& a,Point& b){return hypot(a.x-b.x,a.y-b.y);}
}point[60];double dp[60][N];//dp[i][j]:到第 i 个点为止,状态为 j 时的最小距离 int main()
{
//#ifndef ONLINE_JUDGE
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
//#endif
// ios::sync_with_stdio(false);while(scanf("%d%d",&n,&m)!=EOF&&n+m){init();for(int i=1;i<=n;i++)point[i].input();while(m--){int k;scanf("%d",&k);insert_word(k);}getfail();for(int i=0;i<=n;i++)for(int j=0;j<=cnt;j++)dp[i][j]=1e10;dp[1][trie[0][1]]=0;for(int i=1;i<n;i++)for(int j=0;j<=cnt;j++)if(fabs(dp[i][j]-1e10)>=eps){for(int k=i+1;k<=n;k++){int nj=trie[j][k];if(vis[nj])continue;dp[k][nj]=min(dp[k][nj],dp[i][j]+dis(point[i],point[k]));}}double ans=1e10;for(int i=0;i<=cnt;i++)ans=min(ans,dp[n][i]);if(fabs(ans-1e10)<=eps)puts("Can not be reached!");elseprintf("%.2f\n",ans);}return 0;
}
HDU - 4511 小明系列故事——女友的考验(AC自动机+dp)相关推荐
- HDU 4511 小明系列故事——女友的考验 ( Trie图 DP )
题意 : 给出编号从1 ~ n 的 n 个平面直角坐标系上的点,求从给出的第一个点出发到达最后一个点的最短路径,其中有两种限制,其一就是只能从编号小的点到达编号大的点,再者不能走接下来给出的 m 个 ...
- 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)
Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...
- 小明系列故事——女友的考验
Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...
- hdu 4501 小明系列故事——买年货 多重背包
小明系列故事--买年货 Time Limit: 500 ...
- hdu 4506 小明系列故事——师兄帮帮忙
小明系列故事--师兄帮帮忙 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total ...
- HDU 4506 小明系列故事——师兄帮帮忙
小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- HDU 4501 小明系列故事——买年货
小明系列故事--买年货 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tota ...
- HDU 4528 小明系列故事——捉迷藏
题目链接~~> 做题感悟:这题需要逆向思维,先预处理一下就好. 解题思路:先预处理一下将可以看到 D 与 E 的点标记一下,这样 bfs()遍历迷宫时就可以节省很多时间,还要注意:可以重复走走过 ...
- hdu 4528小明系列故事——捉迷藏
题目:点击打开链接 宽搜.注意判重.判重导致比赛的时候错了两次. #include <cmath> #include <ctime> #include <iostream ...
最新文章
- 调整linux的时钟
- 机器学习研究今年谁最火?几何深度学习成最大赢家,Reddit为提名选手吵成一团...
- Oracle分析函数-OLAP函数总结
- JBoss EAP 7快速入门
- STL之Vector(Linux内核)完整实现
- 标准物模型:设备无缝对接,IOT界的福音
- 2d绘制 c# dx_C# 从零开始写 SharpDx 应用 绘制基础图形
- 华东电脑申威服务器_华东电脑(600850):申威服务器首批量产下线 国产化业务落地里程碑事件[配资公司会议室]...
- 【Netty之进阶篇】
- 从未改过的网名,一如既往的孤荷凌寒——我的信息技术之路之五
- 发完牢骚和惆怅,就继续去看paper吧
- 很实用的一本书-《微软Office技巧大赛优秀作品--Office技巧1000例》
- USB服务器赋能美团数字化建设
- 为什么今天要致敬屠呦呦?
- attribute __naked cannot be compiled without allocated auto area
- Win10桌面我的电脑怎么调出来?最简单方法教学
- 差压艾默生流量计指示为零不工作的4点原因
- 修改JDK安装路径的作用
- tar zxvf 简单了解
- TeraCopy – 优秀免费的Windows复制移动文件加速工具!(可断点续传,支持移动硬盘与U盘)...