数楼梯(高精度)
https://www.luogu.com.cn/problem/P1255
#include <bits/stdc++.h> using namespace std; const int N=5050; int n,q=1,f[N][N]; void jump(int k){ for(int i=1;i<=q;i++) f[k][i]=f[k-1][i]+f[k-2][i]; for(int i=1;i<=q;i++){ if(f[k][i]>=10){ f[k][i+1]+=f[k][i]/10; f[k][i]=f[k][i]%10; if(f[k][q+1]) q++; } } } int main(){ cin>>n; f[1][1]=1; f[2][1]=2; for(int i=3;i<=n;i++) jump(i); for(int i=q;i>=1;i--) cout<<f[n][i]; return 0; }
蜜蜂路线(高精度)
https://www.luogu.com.cn/problem/P2437
#include <bits/stdc++.h> using namespace std; const int N=1050; int n,m,q=1,f[N][N]; void jump(int k){ for(int i=1;i<=q;i++) f[k][i]=f[k-1][i]+f[k-2][i]; for(int i=1;i<=q;i++){ if(f[k][i]>=10){ f[k][i+1]+=f[k][i]/10; f[k][i]=f[k][i]%10; if(f[k][q+1]) q++; } } } int main(){ cin>>m>>n; f[1][1]=1; f[2][1]=2; for(int i=3;i<=n-m;i++) jump(i);//从m到n 和 从1到n-m的解相同 for(int i=q;i>=1;i--) cout<<f[n-m][i]; return 0; }
过河卒
https://www.luogu.com.cn/problem/P1002
#include <bits/stdc++.h> using namespace std; int bx,by,hx,hy; long long f[30][30]; bool s[30][30]; int dx[8]={1,2,2,1,-1,-2,-2,-1},dy[8]={2,1,-1,-2,-2,-1,1,2}; int main(){ cin>>bx>>by>>hx>>hy; bx+=2; by+=2; hx+=2; hy+=2; s[hx][hy]=1; f[2][2]=1; for(int i=0;i<8;i++) { int nx=hx+dx[i]; int ny=hy+dy[i]; s[nx][ny]=1; } for(int i=2;i<=bx;i++){ for(int j=2;j<=by;j++){ if(s[i][j]) continue; else { f[i][j]=max(f[i-1][j]+f[i][j-1],f[i][j]); } } } cout<<f[bx][by]; return 0; }
采药
https://www.luogu.com.cn/problem/P1048
#include <bits/stdc++.h> using namespace std; const int N=1005; int v[N],w[N],n,m,f[N]; int main(){ cin>>m>>n; for(int i=1;i<=n;i++){ cin>>v[i]>>w[i]; } memset(f,0xcf,sizeof(f)); f[0]=0; for(int i=1;i<=n;i++){ for(int j=m;j>=v[i];j--) f[j]=max(f[j],f[j-v[i]]+w[i]); } int ans=0; for(int i=0;i<=m;i++) ans=max(ans,f[i]); cout<<ans; return 0; }
疯狂的采药
https://www.luogu.com.cn/problem/P1616
#include <bits/stdc++.h> using namespace std; const int N=10000005; int v[N],w[N],n,m,f[N]; int main(){ cin>>m>>n; for(int i=1;i<=n;i++){ cin>>v[i]>>w[i]; } memset(f,0xcf,sizeof(f)); f[0]=0; for(int i=1;i<=n;i++){ for(int j=v[i];j<=m;j++) f[j]=max(f[j],f[j-v[i]]+w[i]); } int ans=0; for(int i=0;i<=m;i++) ans=max(ans,f[i]); cout<<ans; return 0; }