TYVJ P1015 公路乘车 &&洛谷 P1192 台阶问题 Label:dp

题目描述

有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式。

输入输出格式

输入格式:

 

输入文件的仅包含两个正整数N,K。

 

输出格式:

 

输入文件stair.out仅包括1个正整数,为不同方式数,由于答案可能很大,你需要输出mod 100003后的结果。

 

输入输出样例

输入样例#1:
5 2
输出样例#1:
8

说明

对于20%的数据,有N ≤ 10, K ≤ 3;

对于40%的数据,有N ≤ 1000;

对于100%的数据,有N ≤ 100000,K ≤ 100。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
int f[10000005];
int main(){
    scanf("%d%d",&n,&k);
    f[0]=1;
    
    for(int j=1;j<=n;j++){
        for(int i=1;i<=k;i++){
            f[j]=(f[j]+f[j-i])%100003;
        }//这里少了一句话,j应该大于或等于i
    }
    printf("%d\n",f[n]);
    return 0;
}
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,k,f[10000005];
 7 int main(){
 8     scanf("%d%d",&n,&k);
 9     f[0]=1;
10     for(int i=1;i<=k;i++){
11         for(int j=i;j<=n;j++){
12             f[j]=(f[j]+f[j-i])%100003;
13         }
14         for(int ll=1;ll<=n;ll++){
15             printf("%d ",f[ll]);
16         }puts("");
17     }
18     printf("%d\n",f[n]);
19     return 0;
20 }
不满足后效性的错误代码

 

 

看题解说是斐波那契数列变形,dp也可以啊

 

 

感觉和TYVJ 1015是差不多的

#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define inf 1000000000
using namespace std;
int n;
int m[15],f[105];
int main()
{
    memset(f,127,sizeof(f));
    f[0]=0;
    for(int i=1;i<=10;i++)
        scanf("%d",&m[i]);
    scanf("%d",&n);
    for(int i=1;i<=10;i++)
        for(int j=0;j<=n;j++)
            if(f[j]<inf)
                f[j+i]=min(f[j+i],f[j]+m[i]);
    printf("%d\n",f[n]);
    return 0;
}

 

FiiFi表示移动i公里的最小代价
Fi=min{fij+mj}

 

posted @ 2016-08-29 19:11  Radiumlrb  阅读(181)  评论(0编辑  收藏  举报