码迷,mamicode.com
首页 > 其他好文 > 详细

HDU5807 Keep In Touch DP

时间:2016-08-13 15:31:59      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

 1 // HDU5807 Keep In Touch   DP
 2 // 思路:直接暴力是O(n^6).所以要优化一下
 3 // dp[i][j][k][0]:当前点i j k的方案数
 4 // dp[i][j][k][1]:j在当前时刻,i k还在上次
 5 // dp[i][j][k][2]:j k在当前时刻,i还在上次
 6 // 那么就可以转移了 本题u<v 所以转移的时候从大到小 从后往前
 7 
 8 #include <bits/stdc++.h>
 9 using namespace std;
10 #define clc(a,b) memset(a,b,sizeof(a))
11 #define inf 0x3f3f3f3f
12 #define lson l,mid,rt<<1
13 #define rson mid+1,r,rt<<1|1
14 const int N = 300010; 
15 const int MOD = 998244353;
16 #define LL long long
17 double const pi = acos(-1);
18 void fre() {freopen("in.txt","r",stdin);}
19 
20 int n,m,c,q;
21 int w[55];
22 int g[55][55];
23 int dp[55][55][55][3];
24 
25 int check(int a,int b,int c){
26    return max(abs(a-b),max(abs(b-c),abs(a-c)));  
27 }
28 void DP(){
29     for(int i=n;i>=1;i--){
30         for(int j=n;j>=1;j--){
31             for(int k=n;k>=1;k--){
32                dp[i][j][k][0]=1,dp[i][j][k][1]=dp[i][j][k][2]=0;
33                for(int h=i+1;h<=n;h++){
34                   if(g[h][i]) dp[i][j][k][0]=(dp[i][j][k][0]+dp[h][j][k][2])%MOD;
35                }
36                for(int h=j+1;h<=n;h++){
37                   if(g[h][j]) dp[i][j][k][1]=(dp[i][h][k][0]+dp[i][j][k][1])%MOD;
38                }
39                for(int h=k+1;h<=n;h++){
40                   if(g[h][k]) dp[i][j][k][2]=(dp[i][j][h][1]+dp[i][j][k][2])%MOD;
41                }
42                if(check(w[i],w[j],w[k])>c) dp[i][j][k][0]=0;
43             }
44         }
45     }
46 }
47 
48 int main(){
49     int T;
50     scanf("%d",&T);
51     while(T--){
52         scanf("%d%d%d%d",&n,&m,&c,&q);
53         for(int i=1;i<=n;i++) scanf("%d",&w[i]);
54         clc(g,0);
55         clc(dp,0);
56         for(int i=1;i<=m;i++) {
57             int u,v;
58             scanf("%d%d",&u,&v);
59             g[v][u]=1;
60         }
61         DP();
62         while(q--){
63             int u,v,z;
64             scanf("%d%d%d",&u,&v,&z);
65             printf("%d\n",dp[u][v][z][0]);
66         }
67     }
68     return 0;
69 }

 

HDU5807 Keep In Touch DP

标签:

原文地址:http://www.cnblogs.com/ITUPC/p/5767896.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!