hdu5807Keep In Touch
来源:互联网 发布:淘宝卖家贷款在哪里 编辑:程序博客网 时间:2024/04/28 02:13
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5807
题意:给定一个50个点的DAG图每个点有个权值w[i],给定初始3个特工所在的位置是x,y,z这3个城市,每一时刻每个人都得移动到下一个城市,并且要求每一时刻两两之间都能联系但且仅当任意两个城市之间的权值差<=k,求有多少种方案结束任务。
分析:因为是DAG图我们可以很容易想到设状态[i][j][k]表示当3个人恰好分别在i和j和k时的方案数,然后要处理的就是如果将后继状态的方案也统计到当前状态啦。如果我们直接去枚举3个位置的后继状态的话这样会是n^3总的时间复杂度就会是O(n^6),这样在完全图时是会T的。我们考虑将这3个人分开移动,设dp[0][i][j][k]表示这个时刻3个人恰好在i和j和k,设dp[1][i][j][k]表示当前时刻第二个人在j而第一个人和第三个人还在上一时刻的地点i和k,设dp[2][i][j][k]表示当前时刻第二个人在j和第三个人在k而第一个人还在上一时刻的地点i。这样的话我们就能从dp[0]->dp[1],dp[1]->dp[2],dp[2]->dp[0]。详见代码。O(n^4)
代码:
#include<map>#include<set>#include<cmath>#include<queue>#include<bitset>#include<math.h>#include<vector>#include<string>#include<stdio.h>#include<cstring>#include<iostream>#include<algorithm>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;const int N=55;const int mod=998244353;const int MOD1=1000000007;const int MOD2=1000000009;const double EPS=0.00000001;typedef long long ll;const ll MOD=1000000007;const int INF=1000000010;const ll MAX=1ll<<55;const double pi=acos(-1.0);typedef double db;typedef unsigned long long ull;int w[N],ma[N][N],dp[3][N][N][N];int ABS(int a,int b,int c) { return max(abs(a-b),max(abs(b-c),abs(a-c)));}int main(){ int a,b,c,i,j,k,h,n,m,lim,q,t; scanf("%d", &t); while (t--) { scanf("%d%d%d%d", &n, &m, &lim, &q); for (i=1;i<=n;i++) scanf("%d", &w[i]); memset(ma,0,sizeof(ma)); for (i=1;i<=m;i++) scanf("%d%d", &a, &b),ma[b][a]=1; for (i=n;i;i--) for (j=n;j;j--) for (k=n;k;k--) { dp[0][i][j][k]=1;dp[1][i][j][k]=dp[2][i][j][k]=0; for (h=i+1;h<=n;h++) if (ma[h][i]) (dp[0][i][j][k]+=dp[2][h][j][k])%=mod; for (h=j+1;h<=n;h++) if (ma[h][j]) (dp[1][i][j][k]+=dp[0][i][h][k])%=mod; for (h=k+1;h<=n;h++) if (ma[h][k]) (dp[2][i][j][k]+=dp[1][i][j][h])%=mod; if (ABS(w[i],w[j],w[k])>lim) dp[0][i][j][k]=0; } while (q--) { scanf("%d%d%d", &a, &b, &c); printf("%d\n", dp[0][a][b][c]); } } return 0;}
0 0
- hdu5807Keep In Touch
- hdu5807Keep In Touch(dp)
- Touch in Android
- Touch in Android
- Multi-touch in air2
- HDU 5361 In Touch
- HDU 5361 In Touch
- HDU5361 In Touch
- hdu Keep In Touch
- HDU5361 In Touch (dij)
- In Touch HDU
- HDOJ 5807 Keep In Touch
- hdu 5807 Keep In Touch
- HDU 5807 Keep In Touch
- hdoj 5807 Keep In Touch
- HDU-5807 Keep In Touch
- Keep In Touch (dp 优化)
- Using Touch Gestures 》Managing Touch Events in a ViewGroup
- leetcode Longest Substring Without Repeating Characters
- 2016-08-07 反射基础
- LeetCode | Unique Binary Search Trees
- Android 关于RecyclerView嵌套Scrollview滑动卡顿问题
- javascript 创建对象,访问对象的属性,访问对象的方法。
- hdu5807Keep In Touch
- 设置关联对象AssociatedObject
- C语言volatile 作用
- 数据结构学习五 递归
- 前端知识点总结
- 长大了,烦恼就多了
- HDU 1003 Max Sum
- android线程池
- 程序睡眠