简单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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!