密集子图(graph) - dp

题目大意:给一张有向完全图,每条边有一个出现概率p。问有多大的概率使得每个点离1号点的最短路不超过k。 n ≤ 12 n\le12 n12
题解:考虑设dp[i,s,t]表示最短路不超过i的点集是s,最短路恰好是i的点集是t,转移枚举下一层,发现可以预处理转移的代价这部分是 O ( 4 n n ) O(4^nn) O(4nn)的。然后这题略卡空间,需要处理 ( s , t ) − > s ′ (s,t)->s' (s,t)>s的映射来卡空间。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define reps(t,s) for(int t=(s);t;t=(t-1)&(s))//t!=0
#define inv(x) fast_pow(x,mod-2)
#define lint long long
#define mod 998244353
#define ull unsigned lint
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{
    int x,ch;while((ch=gc)<'0'||ch>'9');
    x=ch^'0';while((ch=gc)>='0'&&ch<='9')
        x=(x<<1)+(x<<3)+(ch^'0');return x;
}
const int N=14,MXS=531441+10,QWQ=(1<<12)+5;
int p[N][N],lb[MXS],val[MXS],val2[MXS],id[MXS],dp[N][MXS],tr[QWQ][QWQ];
inline int fast_pow(int x,int k,int ans=1) { for(;k;k>>=1,x=(lint)x*x%mod) if(k&1) ans=(lint)ans*x%mod;return ans; }
inline int upd(int &x,lint y) { return x=(x+y)%mod,0; }
namespace TRS_space{
    int n,qwq;inline int trs(int s,int t) { if(qwq) return tr[s][t];int res=0;for(int i=n-1;i>=0;i--) res=res*3+((s>>i)&1)+((t>>i)&1);return res; }
}using TRS_space::trs;
int main()
{
    int n=inn(),k=inn(),all=(1<<n)-1,a,b,v,x,y,v2,v3;TRS_space::n=n;
    rep(i,1,n*(n-1)) x=inn()-1,y=inn()-1,a=inn(),b=inn(),p[x][y]=(lint)a*fast_pow(b,mod-2)%mod;
    dp[0][trs(1,1)]=1;rep(i,1,all) lb[i]=(i&-i),val2[trs(i,i)]=1;rep(i,0,n-1) id[1<<i]=i;
    rep(i,1,all) reps(j,i) tr[i][j]=trs(i,j);TRS_space::qwq=1;
    rep(i,1,all) reps(j,i) if(i^j)
    {
        int s=i^j,t=j,&res=val[trs(i,j)],&res2=val2[trs(i,j)];res=res2=1;
        rep(a,0,n-1) if((t>>a)&1)
        {
            int qwq=1;rep(b,0,n-1) if((s>>b)&1) qwq=qwq*(1ll-p[b][a]+mod)%mod;
            res=res*(1ll-qwq+mod)%mod,res2=(lint)res2*qwq%mod;
        }
    }
    rep(i,0,k-1)
    {
        int *now=dp[i],*nxt=dp[i+1];
        rep(s,0,all) reps(t,s) if((v=now[trs(s,t)])) reps(r,s^all)
            if((v2=val[trs(t|r,r)])&&(v3=val2[trs(s^t^r,r)])) upd(nxt[trs(s|r,r)],(lint)v*v2%mod*v3);
    }
    int ans=0;rep(i,0,k) rep(s,1,all) if(dp[i][trs(all,s)]) upd(ans,dp[i][trs(all,s)]);return !printf("%d\n",ans);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Graph-WaveNet是一种基于图神经网络的语音合成模型。它是Google DeepMind提出的一种创新性的语音合成方法。传统的语音合成模型如WaveNet使用的是基于序列的模型,即将语音合成视为一个逐个采样的过程,这样会导致计算效率低下和难以处理长时间的语音。而Graph-WaveNet则采用了基于图的模型,能够更好地解决这些问题。 Graph-WaveNet的核心思想是将语音信号转化为一个图形结构,其中节点表示音素或其它语音单位,边表示节点之间的依赖关系。这样可以将语音合成问题转化为在图上进行计算的问题。与序列模型相比,图模型能够充分利用语音信号中的局部和全局依赖关系,从而提高合成质量。 使用Graph-WaveNet进行语音合成的过程大致分为两步:图结构建模和声音合成。在图结构建模阶段,语音信号被分割成音素,并通过语音识别系统得到相应的标签。然后,根据音素序列构建一个有向无环图。在声音合成阶段,首先对图进行图卷积操作,以提取特征。然后,利用类似WaveNet的生成模型,根据输入的语音序列生成合成的声音信号。这样,Graph-WaveNet能够在保持高质量语音合成的同时,降低计算复杂度。 Graph-WaveNet的提出为语音合成领域带来了新的突破,使得合成的语音更加自然流畅。此外,Graph-WaveNet还可以扩展到多语种和多说话人的合成任务上,具有很好的拓展性和适应性。这些特点使得Graph-WaveNet成为目前语音合成领域的研究热点之一,并为未来更广泛的应用奠定了基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值