zoukankan      html  css  js  c++  java
  • cf1061c 普通dp题

    题解见https://blog.csdn.net/godleaf/article/details/84402128

    这一类dp题是可以压缩掉一维空间的,本题枚举a1到an,枚举到ai时枚举ai的每个约数,dp[i-1][j]用来表示前i-1个数组成的子串长度是j的解个数,dp[i][j]即时前i个数组成的子串长度是j的解的个数,那么dp[i][j]是dp[i-1][j]+dp[i-1][j-1],即前i个数组成的长度为j的子串个数=前i-1个数组成的长度为j的子串个数+前i-1个数组成的长度为j-1的子串个数

    可以将第一维删掉,那么枚举ai的每个约数时就要从大到小枚举,同时用ans来保存答案

    #include<bits/stdc++.h>
    #define mod 1000000007
    #define maxn 100004
    using namespace std;
    vector<int>v[maxn];
    int n,x,f[maxn*10];
    int main(){
        memset(f,0,sizeof f);
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int x;
            scanf("%d",&x);
            v[i].clear();
            for(int j=1;j<=sqrt(x);j++){
                if(x%j==0){
                    v[i].push_back(j);
                    if(x!=j*j)v[i].push_back(x/j);
                }
            }
            sort(v[i].begin(),v[i].end());
        }
    
        long long ans=0;
        f[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=v[i].size()-1;j>=0;j--){
                f[v[i][j]]=(f[v[i][j]]+f[v[i][j]-1])%mod;
                ans=(ans+f[v[i][j]-1])%mod;
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    Co.
    编程
    编程
    编程
    数据同步
    Co.
    Co.
    Co.
    Co.
    sss
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10051140.html
Copyright © 2011-2022 走看看