zoukankan      html  css  js  c++  java
  • AI 人工智能产业园路口-----dp

    北京市商汤科技开发有限公司建立了新的 AI 人工智能产业园,这个产业园区里有 nn 个路口,由 n - 1n1 条道路连通。第 ii 条道路连接路口 u_iui 和 v_ivi

    每个路口都布有一台信号发射器,信号频段是 11 到 mm 之间的一个整数。

    道路所连接的两个路口的发射信号叠加可能会影响道路的正常运行。具体地,如果第 ii 条道路连接的两个路口发射信号的频段分别为 aa 和 bb,那么 gcd(a, b)gcd(a,b) 不能恰好等于道路的保留频段 w_iwi。每条道路的保留频段是唯一的,即不会与其余任何道路的保留频段相同。

    你现在需要确定每个路口发射信号的频段,使其符合要求。

    在开始之前,你想先算出共有多少种合法的方案。

    由于答案可能很大,输出对 10 ^ 9 + 7109+7 取模的值作为答案。

    输入格式

    第一行,两个正整数 n, mn,m 分别代表路口数量和信号频段上限。

    接下来 n - 1n1 行,每行描述一条道路。第 ii 行有三个整数 u_i, v_i, w_iui,vi,wi 意义如上所述。

    保证 1 le n le m, 1 le u_i, v_i le n, 1 le w_i le m1nm,1ui,vin,1wim。

    输出格式

    输出一个整数,代表合法方案的数量对 10 ^ 9 + 7109+7 取模的值。

    数据范围

    • m le 50m50
    • v_i = u_{i + 1} = u_i + 1vi=ui+1=ui+(1 le i lt n)(1i<n)

    样例解释

    所有合法的方案为 (2, 2, 1), (2, 2, 3), (3, 3, 1), (3, 3, 2), (3, 3, 3)(2,2,1),(2,2,3),(3,3,1),(3,3,2),(3,3,3)。

    样例输入

    3 3
    1 2 1
    2 3 2

    样例输出

    5

    题解:在简单版本中,我们仅需要处理一条链上的情况。可用序列上的动态规划解决。 设a[i]为路口i与i-1相连道路的保留频段 。 令dp[j][k]为路口i获取的信号频段为j 的方案数,
    易得转移方程
    dp[i][j]=dp[i][j]+dp[i][k] (k=1,2,3,4.....m)
    最后输出dp[n][1]+dp[n][2]+dp[n][3]+....+dp[n][m]就是答案了

    #include<iostream>
    #define ll long long
    #define mod 1000000007
    using namespace std;
    int n,m;
    ll a[55],dp[55][55];//dp[i][j]表示路口i的频段为j时的方案数
    ll gcd(int a,int b)
    {
        return b==0?a:gcd(b,a%b);
    }
    
    int main()
    {
        int x,y,w;
        cin>>n>>m;
        for(int i=1;i<=n-1;i++)
        {
            cin>>x>>y>>w;
            a[i]=w;
        }
        for(int i=1;i<=m;i++)//初始化第一个路口
            dp[1][i]=1;
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                for(int k=1;k<=m;k++)
                {
                    if(gcd(j,k)!=a[i-1])
                        dp[i][j]=dp[i][j]+dp[i-1][k];
                    dp[i][j]=dp[i][j]%mod;
                }
            }
        }
        ll ans=0;
        for(int i=1;i<=m;i++)
        {
            ans=ans+dp[n][i];
            ans=ans%mod;
        }
        cout<<ans<<endl;
    
        return 0;
    
    }
    
    // 3 3
    // 1 2 1
    // 2 3 2
  • 相关阅读:
    Apache Commons CLI命令行启动
    《三体1——地球往事》—— 读后总结
    《鬼谷子的局4》 —— 读后总结
    Microsoft Visual C++ 2017 Redistributable
    Navicat Premium 12安装与激活(亲测已成功激活)
    如何从DOS命令窗口进行复制粘贴
    使用java写js中类似setTimeout的代码
    Spring @RestController、@Controller区别
    SpringBoot整合Swagger2
    git clone 报“The project you were looking for could not be found.”
  • 原文地址:https://www.cnblogs.com/-citywall123/p/10940330.html
Copyright © 2011-2022 走看看