走楼梯问题
#include<bits/stdc++.h>
using namespace std;
const int maxn = 255;
int dp[maxn];
int fib (int n){
dp[1] = dp[2] =1;
for (int i = 3;i<=n;i++)
dp[i] = dp[i-1] +dp[i-2];
return dp[n];
}
int main(){
int n;
cin >> n;
cout <<fib(n);
}
#include<bits/stdc++.h>
using namespace std;
int dp[1001][1001],a[1001],b[1001];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
if(a[i]==b[j])
dp[i][j] = max(dp[i][j],dp[i-1][j-1]+1);
else
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
cout << dp[n][m];
}
#include<bits/stdc++.h>
using namespace std;
const int N = 10001;
int a[N],dp[N];
int main(){
int n; cin >> n;
for(int i=1; i<=n; i++) cin >> a[i];
int ans = 1;
dp[1] = 1;
for(int i = 2; i <= n; i++){
int max = 0;
for(int j=1; j<i; j++)
if(dp[j] > max && a[j] < a[i])
max = dp[j];
dp[i] = max+1;
if(dp[i] > ans) ans = dp[i];
}
cout << ans << endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int dp[3005][3005],m,n;
char a[3005],b[3005];
void solve(){
dp[0][0]=0;
for(int i=1;i<=m;i++) dp[i][0]=i;
for(int j=1;j<=n;j++) dp[0][j]=j;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++) {
if(a[i] == b[j])
dp[i][j] = dp[i-1][j-1];
else
dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
}
}
int main(){
scanf("%s %s",a+1,b+1); //a[0],b[0]不用
m = strlen(a+1);
n = strlen(b+1);
solve();
printf("%d\n",dp[m][n]);
}
#include<bits/stdc++.h>
using namespace std;
const int N = 3011;
int w[N], c[N]; // 物品的价值和体积
int dp[N][N];
int solve(int n, int C){
for (int i = 1; i <= n; i++) {
for (int j = C; j >= 0; j--) {
if(i==1) dp[i][j] = 0;
else dp[i][j] = dp[i - 1][j];
for (int k = 0; k * c[i] <= j; k++)
dp[i][j] = max(dp[i][j], dp[i - 1][j - k * c[i]] + k * w[i]);
}
}
return dp[n][C];
}
int main(){
int n,C; cin >> n >> C;
for(int i=1;i<=n;i++)
cin >> c[i] >> w[i];
memset(dp,0,sizeof(dp));
cout << solve(n, C) << endl;
return 0;
}
#include<cstdio>
using namespace std;
int dp[20010];
int w[40];
int main(){
int V,n;
scanf("%d%d",&V,&n);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1; i<=n; i++)
for(int j=V; j>=w[i]; j--)
if(dp[j] < dp[j-w[i]]+w[i])
dp[j] = dp[j-w[i]]+w[i];
printf("%d\n",V-dp[V]);
}
#include<bits/stdc++.h>
using namespace std;
long long dp[40][40];
bool s[40][40]; //标记马的9个控制点
int main(){
int bx, by, mx, my;
scanf("%d%d%d%d", &bx, &by, &mx, &my);
bx += 2; by += 2; mx += 2; my += 2;
//坐标点加2,防止越界,因为马能向上向左跳2格
dp[2][1] = 1; //初始化
s[mx][my]=1; //标记马的控制点
s[mx-2][my-1]=1; s[mx-2][my+1]=1;
s[mx+2][my-1]=1; s[mx+2][my+1]=1;
s[mx-1][my+2]=1; s[mx-1][my-2]=1;
s[mx+1][my+2]=1; s[mx+1][my-2]=1;
for(int i = 2; i <= bx; i++)
for(int j = 2; j <= by; j++){
if(s[i][j]) dp[i][j]=0; //这个点是控制点,不能走
else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
printf("%lld\n", dp[bx][by]);
return 0;
}