本文主要是介绍SSL 2386 序列#线性动态规划#,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
比赛
题目
分析
dp,状态转移方程: f [ i ] [ j ] 表 示 第 j 位 的 数 字 是 i 的 方 案 f[i][j]表示第j位的数字是i的方案 f[i][j]表示第j位的数字是i的方案
f [ i ] [ j ] + = f [ ( i 的 因 数 ) ] [ j − 1 ] ( 逆 推 ) f[i][j]+=f[(i的因数)][j-1](逆推) f[i][j]+=f[(i的因数)][j−1](逆推)
f [ i ∗ ( 1 t o n / j ) ] [ j ] + = f [ i ] [ j − 1 ] ( 顺 推 ) f[i*(1 _{to}n/j)][j]+=f[i][j-1](顺推) f[i∗(1ton/j)][j]+=f[i][j−1](顺推)
逆推代码
#include <cstdio>
#include <cstring>
using namespace std;
struct node{int x,y,next;}e[100001];
int f[2002][2002],n,m,k,ans,ls[2001];
int main(){scanf("%d%d",&n,&k);for (int i=1;i<=n;i++) f[i][1]=1;for (int i=1;i<=n;i++)for (int j=1;j<=i;j++)if (i%j==0) e[++m].x=i,e[m].y=j,e[m].next=ls[e[m].x],ls[e[m].x]=m;//邻接表优化for (int j=2;j<=k;j++)for (int i=1;i<=n;i++){int t=ls[i];while (t){f[i][j]=(f[i][j]+f[e[t].y][j-1])%1000000007;t=e[t].next;}}for (int i=1;i<=n;i++) ans=(ans+f[i][k])%1000000007;printf("%d",ans);return 0;
}
顺推代码
#include <cstdio>
#include <cstring>
#define p 1000000007
using namespace std;
int f[2002][2002],n,m,ans;
int main(){scanf("%d%d",&n,&m);for (int i=1;i<=n;i++) f[i][1]=1;for (int j=2;j<=m;j++)for (int i=1;i<=n;i++)for (int k=1;k<=n/i;k++) f[i*k][j]=(f[i][j-1]+f[i*k][j])%p;for (int i=1;i<=n;i++) ans=(ans+f[i][m])%p;printf("%d",ans);return 0;
}
这篇关于SSL 2386 序列#线性动态规划#的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!