数楼梯(高精度)
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;
}