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; }
Fi表示移动i公里的最小代价Fi表示移动i公里的最小代价则Fi=min{fi−j+mj}
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!