zoj-4011(动态规划)
生活随笔
收集整理的這篇文章主要介紹了
zoj-4011(动态规划)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本題的動態規劃公式是f[i][j]=f[i][j]+f[k][j-1],表示以i結尾的長度為j的序列,k為i的因子;
不難發現,計算中存在一個狀態疊加的過程,即任意一個i都是它的因子的所有情況的疊加,例如[9][3],它會是以1,3結尾的長度為2的狀態的疊加;
代碼如下:
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<map> #include<vector> #include<cstdio> #include<cmath> using namespace std; const int maxn=2000+10; const int mod=1e9+7; int flag[maxn][maxn];/*狀態轉移方程*/ vector<int>v[maxn];/*用來存放v[i]的所有因子*/ void csh() {memset(flag,0,sizeof(flag));for(int i=1;i<maxn;i++){for(int j=1;j<maxn;j++){if(j%i==0)v[j].push_back(i);/*存放因子*/}}for(int i=1;i<maxn;i++){flag[i][1]=1;/*初始狀態即以i結尾長度為1的情況都只有一種*/}for(int i=2;i<maxn;i++){for(int j=1;j<maxn;j++){for(int k=0;k<v[j].size();k++){flag[j][i]=flag[j][i]%mod+flag[v[j][k]][i-1]%mod;/*狀態疊加*/}flag[i][j]%=mod;}} } int main() {csh();int t;while(scanf("%d",&t)!=EOF){while(t--){int n,m;scanf("%d %d",&n,&m);long long sum=0;for(int i=1;i<=n;i++){sum=(sum+flag[i][m])%mod;}printf("%lld\n",sum);}} }?
轉載于:https://www.cnblogs.com/KasenBob/p/10042178.html
總結
以上是生活随笔為你收集整理的zoj-4011(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery获取或设置元素的宽度和高度
- 下一篇: 预支工资是什么意思