题目链接:点击查看

题目大意:小明在点 1 而小明的女朋友在点 n ,现在小明要去找女朋友,满足以下两个条件:

  1. 途径的序号满足严格递增
  2. 小明的女朋友给小明提出了 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)相关推荐

  1. HDU 4511 小明系列故事——女友的考验 ( Trie图 DP )

    题意 :  给出编号从1 ~ n 的 n 个平面直角坐标系上的点,求从给出的第一个点出发到达最后一个点的最短路径,其中有两种限制,其一就是只能从编号小的点到达编号大的点,再者不能走接下来给出的 m 个 ...

  2. 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)

    Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...

  3. 小明系列故事——女友的考验

    Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...

  4. hdu 4501 小明系列故事——买年货 多重背包

    小明系列故事--买年货                                                                          Time Limit: 500 ...

  5. hdu 4506 小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total ...

  6. HDU 4506 小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  7. HDU 4501 小明系列故事——买年货

    小明系列故事--买年货 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tota ...

  8. HDU 4528 小明系列故事——捉迷藏

    题目链接~~> 做题感悟:这题需要逆向思维,先预处理一下就好. 解题思路:先预处理一下将可以看到 D 与 E 的点标记一下,这样 bfs()遍历迷宫时就可以节省很多时间,还要注意:可以重复走走过 ...

  9. hdu 4528小明系列故事——捉迷藏

    题目:点击打开链接 宽搜.注意判重.判重导致比赛的时候错了两次. #include <cmath> #include <ctime> #include <iostream ...

最新文章

  1. 调整linux的时钟
  2. 机器学习研究今年谁最火?几何深度学习成最大赢家,Reddit为提名选手吵成一团...
  3. Oracle分析函数-OLAP函数总结
  4. JBoss EAP 7快速入门
  5. STL之Vector(Linux内核)完整实现
  6. 标准物模型:设备无缝对接,IOT界的福音
  7. 2d绘制 c# dx_C# 从零开始写 SharpDx 应用 绘制基础图形
  8. 华东电脑申威服务器_华东电脑(600850):申威服务器首批量产下线 国产化业务落地里程碑事件[配资公司会议室]...
  9. 【Netty之进阶篇】
  10. 从未改过的网名,一如既往的孤荷凌寒——我的信息技术之路之五
  11. 发完牢骚和惆怅,就继续去看paper吧
  12. 很实用的一本书-《微软Office技巧大赛优秀作品--Office技巧1000例》
  13. USB服务器赋能美团数字化建设
  14. 为什么今天要致敬屠呦呦?
  15. attribute __naked cannot be compiled without allocated auto area
  16. Win10桌面我的电脑怎么调出来?最简单方法教学
  17. 差压艾默生流量计指示为零不工作的4点原因
  18. 修改JDK安装路径的作用
  19. tar zxvf 简单了解
  20. TeraCopy – 优秀免费的Windows复制移动文件加速工具!(可断点续传,支持移动硬盘与U盘)...

热门文章

  1. 自我引用(Self reference)
  2. SpringBoot底层注解-@ImportResource导入Spring配置文件
  3. SimpleExecutor.doQuery()-创建StatementHandler
  4. mybatis-物理翻页
  5. 高仿真的类-BeanWrapper
  6. 支付宝支付 - 异步通知与同步通知
  7. Stream流中间操作方法
  8. 动态代理的概述和实现
  9. Junit_测试概述
  10. AOP日志-查询日志流程分析