zoj-4011(动态规划)
生活随笔
收集整理的這篇文章主要介紹了
zoj-4011(动态规划)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本題的動(dòng)態(tài)規(guī)劃公式是f[i][j]=f[i][j]+f[k][j-1],表示以i結(jié)尾的長度為j的序列,k為i的因子;
不難發(fā)現(xiàn),計(jì)算中存在一個(gè)狀態(tài)疊加的過程,即任意一個(gè)i都是它的因子的所有情況的疊加,例如[9][3],它會(huì)是以1,3結(jié)尾的長度為2的狀態(tài)的疊加;
代碼如下:
#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];/*狀態(tài)轉(zhuǎn)移方程*/ 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;/*初始狀態(tài)即以i結(jié)尾長度為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;/*狀態(tài)疊加*/}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);}} }?
轉(zhuǎn)載于:https://www.cnblogs.com/KasenBob/p/10042178.html
總結(jié)
以上是生活随笔為你收集整理的zoj-4011(动态规划)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery获取或设置元素的宽度和高度
- 下一篇: 预支工资是什么意思