博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU5807 Keep In Touch (BestCoder Round #86 D ) 分布式dp
阅读量:4616 次
发布时间:2019-06-09

本文共 1413 字,大约阅读时间需要 4 分钟。

#include 
#include
#include
#include
#include
using namespace std;typedef long long LL;const int N = 50+2;const int mod = 998244353;int T,n,m,lim,q,tot,w[N],dp[N][N][N][3],head[N];struct Edge{ int v,next;}edge[N*N/2];void add(int u,int v){ edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++;}inline void up(int &x,int y){ x+=y;if(x>=mod)x-=mod;}bool judge(int i,int j){ return abs(w[i]-w[j])<=lim;}int main(){ scanf("%d",&T); while(T--){ scanf("%d%d%d%d",&n,&m,&lim,&q); for(int i=1;i<=n;++i)scanf("%d",&w[i]); memset(head,-1,sizeof(head)),tot=0; for(int i=0;i
0;--i) for(int j=n;j>0;--j) for(int k=n;k>0;--k){ if(judge(i,j)&&judge(j,k)&&judge(k,i)) up(dp[i][j][k][0],1); if(dp[i][j][k][0]) for(int k1=head[i];~k1;k1=edge[k1].next) up(dp[edge[k1].v][j][k][1],dp[i][j][k][0]); if(dp[i][j][k][1]) for(int k1=head[j];~k1;k1=edge[k1].next) if(!judge(i,edge[k1].v))continue; else up(dp[i][edge[k1].v][k][2],dp[i][j][k][1]); if(dp[i][j][k][2]) for(int k1=head[k];~k1;k1=edge[k1].next){ if(!judge(i,j)||!judge(i,edge[k1].v)||!judge(j,edge[k1].v)) continue; up(dp[i][j][edge[k1].v][0],dp[i][j][k][2]); } } while(q--){ int x,y,z; scanf("%d%d%d",&x,&y,&z); printf("%d\n",dp[x][y][z][0]); } } return 0;}
View Code

 

转载于:https://www.cnblogs.com/shuguangzw/p/5747469.html

你可能感兴趣的文章
坚持记录
查看>>
AtCoder Regular Contest 076 E - Connected?
查看>>
python实现带误差传递的数学计算
查看>>
开始使用Mac OS X——写给Mac新人
查看>>
Permission Policies
查看>>
安装xdg-open
查看>>
"注解"的用法
查看>>
tornado
查看>>
Redis
查看>>
C# 正则表达式、Json
查看>>
验证radio 是否被选中
查看>>
铁乐学python_day25_序列化模块
查看>>
四则运算
查看>>
手机自动化测试:Appium源码分析之跟踪代码分析六
查看>>
大话数据结构七:两栈共享存储空间(双向栈)
查看>>
微信支付二维码native原生支付开发模式一
查看>>
c/c++编写window服务的授权服务(四)
查看>>
C++代码统计工具
查看>>
需求分析报告
查看>>
第四次作业
查看>>