简单dp
ABC240 C
题目链接
https://atcoder.jp/contests/abc240/tasks/abc240_c
解析
看到这个题首先想到的是二进制枚举,但是数据范围太大了显然是不可能的,所以考虑dp,有点以空间换时间的意味。f[i][j]表示走i步是否可以到达j,然后递推就行了。dp可能初值设定比较难想,其实可以简单模拟样例思考如何赋初值。
Ac代码
点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, M = 10010;
bool f[N][M];
int n, x;
int main()
{
scanf("%d%d", &n, &x);
f[0][0] = true;
for(int i = 1; i <= n; i ++){
int a, b;
scanf("%d%d", &a, &b);
for(int j = 0; j <= x; j ++){
if(j - a >= 0) f[i][j] |= f[i - 1][j - a];
if(j - b >= 0) f[i][j] |= f[i - 1][j - b];
}
}
if(f[n][x]) printf("Yes\n");
else printf("No\n");
return 0;
}
AcWing 2067. 走方格
题目链接
https://www.acwing.com/problem/content/description/2069/
解析
就是个二维的dp,赋一个初值,注意题目中不能走的点直接赋值为0即可,所以不需要做很多特判。
Ac代码
点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 40;
int n, m;
int f[N][N];
int main()
{
scanf("%d%d",&n, &m);
f[1][1] = 1;
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= m; j ++){
if(i % 2 != 0 || j % 2 != 0){
f[i][j] += f[i - 1][j];
f[i][j] += f[i][j - 1];
}
}
}
printf("%d\n", f[n][m]);
return 0;
}

浙公网安备 33010602011771号