hdu5807 dp
来源:互联网 发布:400÷1.25的简便算法 编辑:程序博客网 时间:2024/05/22 15:18
问题描述
在Byteland一共有n个城市,编号依次为1到n,同时有m条单向道路连接着这些城市,其中第ii条道路的起点为ui终点为vi
特工团队一共有33名成员:007,008,以及009,他们将要执行q次秘密任务。
在每次任务中,三人可能会处于三个不同的城市,他们互相之间通过对讲机保持联络。编号为ii的城市的无线电频为wi
,如果两个城市的无线电频差值的绝对值不超过K,那么无线电就可以接通。三个特工每个时刻必须要选择一条道路,走到下一个城市,每条道路都只需要花费1单位时间。
他们可以选择在任意城市终止任务,甚至可以在起点就终止任务,但不允许在道路上终止任务。现在他们想知道,对于每次任务,给定三个人的起始位置,有多少种可能的合法行动方案,使得行动过程中任意在城市的时刻,他们都可以两两联络?
两个方案被视作不同当且仅当至少存在一个人在某一时刻所在的城市不同。
注意:3个特工必须同时结束任务。
解法
最开始没看到u < v坑爹,这个很重要说明了这是个DAG并且很好转移,只要将dp值从后往前转移就行了
代码
#include<bits/stdc++.h>using namespace std;int n, m, k, q;const int MOD = 998244353;int w[55];int cnn[55][55];int dp[3][55][55][55];//设dp[0][i][j][k]表示这个时刻3个人恰好在i和j和k,//设dp[1][i][j][k]表示当前时刻第二个人在j而第一个人和第三个人还在上一时刻的地点i和k,//设dp[2][i][j][k]表示当前时刻第二个人在j和第三个人在k而第一个人还在上一时刻的地点iint mxdis(int a,int b,int c) { return max(max(abs(a-b),abs(b-c)),abs(a-c));}int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&n,&m,&k,&q); for(int i = 1; i <= n; i++) scanf("%d",&w[i]); memset(cnn, 0, sizeof(cnn)); while(m--) { int u, v; scanf("%d%d",&u,&v); cnn[u][v] = 1; } for(int i = n; i >= 1; i--) { for(int j = n; j >= 1; j--) { for(int k = n; k >= 1; k--) { dp[0][i][j][k] = 1; dp[1][i][j][k] = dp[2][i][j][k] = 0; for(int u = i + 1; u <= n; u++) if(cnn[i][u]) (dp[0][i][j][k] += dp[2][u][j][k]) %= MOD; for(int u = j + 1; u <= n; u++) if(cnn[j][u]) (dp[1][i][j][k] += dp[0][i][u][k]) %= MOD; for(int u = k + 1; u <= n; u++) if(cnn[k][u]) (dp[2][i][j][k] += dp[1][i][j][u]) %= MOD; if(mxdis(w[i], w[j], w[k]) > ::k) dp[0][i][j][k] = 0; } } } while(q--) { int a, b, c; scanf("%d%d%d",&a,&b,&c); printf("%d\n",dp[0][a][b][c]); } } }
0 0
- hdu5807 dp
- 【HDU5807 BestCoder Round 86D】【分步式DP 状态转化】Keep In Touch 三人起点(i,j,k)保持联络条件下行走路径数
- BestCoder Round #85 (hdu5804,hdu5805,hdu5806,hdu5807)
- hdu5807 Keep In Touch (加维优化)
- dp
- dp
- dp
- 【DP】
- dp
- dp
- DP
- DP
- DP
- DP
- DP
- dp
- DP
- dp
- 同步助手64位 v3.2.7.2 官方最新版
- Android 缓存浅谈(一) LruCache
- OC中的属性和成员变量在.h文件和.m文件的不同
- 异常:Project configuration is not up-to-date with pom.xml解决方案
- Opencv中颜色通道分离、混合的split和merge
- hdu5807 dp
- CSS3动画
- 解决Sublime Text 3在GBK编码下的中文乱码问题
- 微信开发学习第一天- 群发功能
- 常用正则表达式
- URAL 1076:费用流解法
- 欢迎使用CSDN-markdown编辑器
- hdu 5800 To My Girlfriend(2016 Multi-University Training Contest 6——DP)
- 尼姆博弈