【菜逼从零学dp】dp专题

自己dp 太菜 基本没写过题所以就 从新来过从最简单的开始写吧 记录一下自己的历程

 题目链接:牛牛与数组

dp[j,i] 表示 第j 位数  以i 结尾的 有多少个

先记录 以i结尾的 一共多少  然后把i 的 因子找出来 去掉就好了

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
const int mod = (int)1e9+7;
int dp[11][maxn];
int main(){
    int n,k;
    scanf("%d%d",&n,&k);

    for( int j=1;j<=k;j++){
       dp[1][j] = 1;
    }
    for(int j=2;j<=n;j++){
        int x = 0, y = 0;
        for(int i=1;i<=k;i++){
           x += dp[j-1][i];    // 记录总和
           x = x%mod;
        }
        for(int i=1;i<=k;i++){
           y = 0;
           for(int z = i*2;z<=k;z+=i){
              y += dp[j-1][z];  // 把i 的因子全部去掉
              y %= mod;
           }
           dp[j][i] = (x-y+mod)%mod;
        }
    }
    int ans = 0;
    for(int j=1;j<=k;j++){
        ans += dp[n][j];
        ans %= mod;
    }
    printf("%d\n",ans);

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/DyLoder/p/10604127.html