简单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;
}
posted @   小菜珠的成长之路  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示