[P1941][NOIP2014T3] 飞扬的小鸟 (0/1背包+完全背包)

本文解析了一款小鸟过管道游戏的算法实现,利用0/1背包与完全背包的概念,解决小鸟从地图左侧飞至右侧的问题,计算最少点击次数及可行路径。通过状态转移方程,确保小鸟不会碰撞管道,并在有限条件下完成飞行。

题意:给出一张地图,有若干个竖直的管道,有一只鸟从地图最左边要飞到地图最右边,每次点击屏幕,小鸟就会上升,若不点击,小鸟就会下降;途中小鸟不能飞(掉)出地图,也不能碰到管道;

求这一只鸟从地图最左边是否能飞到地图最右边,如果能,那么最小的点击次数是多少;

解法:0/1背包+完全背包;

1.0/1背包;当小鸟处在 (i,j)这个位置时,可以不点击屏幕;那么此时就是一个0/1背包;状态转移方程:f[i][j]=min(f[i-1][j-x[i]]+1,f[i][j-x[i]]+1);

2.完全背包;当小鸟处在(i,j)这个位置时,可以点击多次屏幕;那么此时就是一个完全背包;状态转移方程:f[i][j]=min(f[i][j],f[i-1][j+y[i]]);

有管道的地方可以  f[i][j]=inf;转移是从左到右,从下到上;

附上代码:

#include<iostream> 
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=10086;
const int inf = 0x3f3f3f3f;

inline int read(){
    int ref=0,x=1; char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')x=-1;ch=getchar();}
    while(isdigit(ch)){ref=ref*10+ch-'0';ch=getchar();}
    return ref*x;
}

int n,m,p;
int x[N],y[N];
int low[N],high[N],dp[N][2019];
bool jud[N];

int main()
{
    scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=n;i++) x[i]=read(),y[i]=read();
    for(int i=1;i<=n;i++){
        low[i]=1;
        high[i]=m;
    }
    for(int i=1;i<=p;i++){
        int a,b,c;
        a=read(),b=read(),c=read();
        jud[a]=1;
        low[a]=b+1;
        high[a]=c-1;
    }
    memset(dp,0x3f3f3f,sizeof(dp));
    for(int i=1;i<=m;i++) dp[0][i]=0;
    for(int i=1;i<=n;i++){
        for(int j=x[i]+1;j<=m+x[i];j++) dp[i][j]=min(dp[i-1][j-x[i]]+1,dp[i][j-x[i]]+1);
        for(int j=1;j<=m-y[i];j++) dp[i][j]=min(dp[i][j],dp[i-1][j+y[i]]);
        for(int j=m+1;j<=m+x[i];j++) dp[i][m]=min(dp[i][m],dp[i][j]);
        for(int j=1;j<low[i];j++) dp[i][j]=inf;
        for(int j=high[i]+1;j<=m;j++) dp[i][j]=inf;
    }
    int ans=inf;
    for(int j=1;j<=m;j++) {
        ans=min(ans,dp[n][j]);
    }
    if(ans<inf) printf("1\n%d",ans);
    else{
        int place;
        bool ljw=false;
        for(int i=n-1;i>=1;i--) {
            for(int j=1;j<=m;j++){
                if(dp[i][j]<inf){
                    place=i;
                    ljw=true;
                    break;
                }
            }
            if(ljw) break;
        }
        ans=0;
        for(int i=1;i<=place;i++){
            if(jud[i]) ans++;
        }
        printf("0\n%d",ans);
    }
    return 0;
}

转载于:https://www.cnblogs.com/nnezgy/p/11371895.html

数据集介绍:垃圾分类检测数据集 一、基础信息 数据集名称:垃圾分类检测数据集 图片数量: 训练集:2,817张图片 验证集:621张图片 测试集:317张图片 总计:3,755张图片 分类类别: - 金属:常见的金属垃圾材料。 - 纸板:纸板类垃圾,如包装盒等。 - 塑料:塑料类垃圾,如瓶子、容器等。 标注格式: YOLO格式,包含边界框和类别标签,适用于目标检测任务。 数据格式:图片来源于实际场景,格式为常见图像格式(如JPEG/PNG)。 二、适用场景 智能垃圾回收系统开发: 数据集支持目标检测任务,帮助构建能够自动识别和分类垃圾材料的AI模型,用于自动化废物分类和回收系统。 环境监测与废物管理: 集成至监控系统或机器人中,实时检测垃圾并分类,提升废物处理效率和环保水平。 学术研究与教育: 支持计算机视觉与环保领域的交叉研究,用于教学、实验和论文发表。 三、数据集优势 类别覆盖全面: 包含三种常见垃圾材料类别,覆盖日常生活中主要的可回收物类型,具有实际应用价值。 标注精准可靠: 采用YOLO标注格式,边界框定位精确,类别标签准确,便于模型直接训练和使用。 数据量适中合理: 训练集、验证集和测试集分布均衡,提供足够样本用于模型学习和评估。 任务适配性强: 标注兼容主流深度学习框架(如YOLO等),可直接用于目标检测任务,支持垃圾检测相关应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值