zoukankan      html  css  js  c++  java
  • HDU 5807 Keep In Touch

    加维降复杂度

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    const double pi=acos(-1.0),eps=1e-8;
    void File()
    {
        freopen("D:\in.txt","r",stdin);
        freopen("D:\out.txt","w",stdout);
    }
    inline int read()
    {
        char c = getchar();  while(!isdigit(c)) c = getchar();
        int x = 0;
        while(isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); }
        return x;
    }
    
    const int maxn=50+10;
    int mod=998244353;
    int T,n,m,k,q,g[maxn][maxn],w[maxn],f[maxn][maxn][maxn][4];
    
    bool check(int a,int b,int c)
    {
        if(abs(w[a]-w[b])>k) return 0;
        if(abs(w[a]-w[c])>k) return 0;
        if(abs(w[b]-w[c])>k) return 0;
        return 1;
    }
    
    int main()
    {
        scanf("%d",&T); while(T--)
        {
            scanf("%d%d%d%d",&n,&m,&k,&q);
            memset(g,0,sizeof g);
            for(int i=1;i<=n;i++) scanf("%d",&w[i]);
            for(int i=1;i<=m;i++)
            {
                int u,v; scanf("%d%d",&u,&v);
                g[u][v]=1;
            }
            memset(f,0,sizeof f);
            for(int i=n;i>=1;i--)
            {
                for(int j=n;j>=1;j--)
                {
                    for(int k=n;k>=1;k--)
                    {
                        if(check(i,j,k)==0) f[i][j][k][0]=0;
                        else f[i][j][k][0]=(f[i][j][k][0]+1)%mod;
    
                        for(int s=1;s<k;s++)
                            if(g[s][k]) f[i][j][s][2]=(f[i][j][s][2]+f[i][j][k][0])%mod;
    
                        for(int s=1;s<=j;s++)
                            if(g[s][j]) f[i][s][k][1]=(f[i][s][k][1]+f[i][j][k][2])%mod;
    
                        for(int s=1;s<=i;s++)
                            if(g[s][i]) f[s][j][k][0]=(f[s][j][k][0]+f[i][j][k][1])%mod;
                    }
                }
            }
    
            for(int i=1;i<=q;i++)
            {
                int a,b,c; scanf("%d%d%d",&a,&b,&c);
                printf("%d
    ",f[a][b][c][0]);
            }
        }
        return 0;
    }
  • 相关阅读:
    ubuntu的apt
    sudo命令
    MySQL导出数据到csv文件
    MySQL导出数据到文件报错
    git_backup.py gitlab项目备份
    java中图像与数组转换
    mongodb转elasticsearch
    impyla-0.14.2.2安装注意事项
    python3.7.3升级 with-openssl openssl-1.0.2a
    hadoop自带性能测试
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5752096.html
Copyright © 2011-2022 走看看