2017Nowcoder Girl E - 勇敢的妞妞(状态压缩+dp)

在牛家庄遭受外星人侵袭的背景下,妞妞需从N件装备中选择K件以最大化战斗力。通过动态规划算法,考虑装备间属性影响,计算最优装备组合以提升妞妞的战斗能力。

题目描述 

美丽的牛家庄受到了外星人的侵略, 勇敢的妞妞要上战场抵御侵略。

 

在妞妞上战场前, 村长牛牛给了妞妞N件装备, 妞妞需要选择其中的K件,装备在身上提升自己的战斗力。每件装备有5种属性增幅值,对于第i件装备它的属性增幅值为(ri1, ri2, ri3, ri4, ri5), 分别代表该装备对不同的属性值增幅。

当妞妞装备多件装备的时候,由于装备之前会互相影响, 对于每种属性值的增幅并不是所有装备该属性值之和, 而是该种属性值下所有装备中最大的属性值。而妞妞最终增加的战斗力为这5种属性值增幅之和。

 

妞妞一定要保卫牛家庄, 所以她希望她能提升尽可能多的战斗力, 请你帮帮她计算她最多能增加多少战斗力。

输入描述:


 

输入包括N+1行,

第一行包括两个正整数N和K(1 <= N <= 10000, 1 <= K <= N), 分别表示一共有的装备数量和妞妞需要选择的装备数量。

接下来的N行,每行5个整数ri1, ri2, ri3, ri4, ri5 (0 <= ri1, ri2, ri3, ri4, ri5 <= 10000)表示第i件装备的5种属性值增幅。

输出描述:

输出一个整数,表示妞妞最多能增加的战斗力。

示例1

输入

复制

4 2
30 30 30 30 0
50 0 0 0 0
0 50 0 50 10
0 0 50 0 20

输出

复制

170

说明

妞妞要从4件装备中选取2件, 如果妞妞选择第1件和第3件装备,那么增加的战斗力为30 + 50 + 30 + 50 + 10 = 170, 这是最大的方案。

 

 

思路:

将五个属性值压缩成2^5个状态,即 

0 0 0 0 0;

0 0 0 0 1;

0 0 0 1 0;

0 0 0 1 1

……

1 1 1 1 1 

意义为,1对应属性为有效属性(和最大),如00011为 第1和第2属性的和是最大值的物品;

令dp[1<<5][5](取i状态 的 j个装备);

如:其中dp[3][1] ;意义为 状态  0 0 0 1 1 只取 第1和第2属性的和最大的 一个装备

初始化1个装备的所有状态值。

两个装备的状态通过两个一个装备的状态和得到。

即:两个一个装备只取属性 1 1 1 0 0 & 0 0 0 1 1 可 得到五个属性 1 1 1 1 1 (要保证没有属性重复 )

那么上述可表示为 dp[31][2]=max(dp[31][2],dp[28][1]+dp[3][1])

(转移方程为dp[i|j][v]=max(dp[i|j][v],dp[i][v-1]+dp[j][1] ,其中v为装备数量(获得状态i的(v-1)个装备数量+获得状态j的1个装备))

求最后v个装备可获得的最大值

【因为dp学得不好,比较难缕思路,多多包涵】

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=10010;
int n,k;
int a[maxn][5];
int main()
{
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        memset(a,0,sizeof(a));
        int r[5]={0};
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3],&a[i][4]);
            for(int j=0;j<5;j++)r[j]=max(r[j],a[i][j]);
        }
        if(k>=5)
        {
            printf("%d\n",r[0]+r[1]+r[2]+r[3]+r[4]);
            continue;
        }
        int sum,ans=0;
        int dp[1<<5][5]={0};
        dp[0][0]=0;
        for(int i=0;i<32;i++)//第i种状态 0 0 0 0 0;0 0 0 0 1;0 0 0 1 0;0 0 0 1 1 …… 1 1 1 1 1
        {
            for(int j=0;j<n;j++)//第j个装备的
            {
                sum=0;
                for(int v=0;v<5;v++)//五个属性
                {
                    int s=1<<v;//将第(v+1)个属性置为1其余为0
                    //只有状态i中为1的位置才与s位与 不为0
                    if((i&s)!=0)
                    {
                        sum+=a[j][v];
                    }
                }
                //只有一个装备 取 只对应状态属性的属性和
                //如dp[1][1];  0 0 0 0 1 只去第一个属性和最大的 一个装备
                //dp[3][1]; 0 0 0 1 1 只取 第一和第二和属性和最大的 一个装备
                dp[i][1]=max(dp[i][1],sum);
            }
            ans=max(ans,dp[i][1]);
        }
        for(int v=2;v<=k;v++)
        {
            for(int i=0;i<32;i++)
            {
                for(int j=0;j<32;j++)
                {
                    if((i&j)==0) //i与j的状态 即没有同一种属性取两次
                    {
                        //两种状态相加后的 v个装备
                        dp[i|j][v]=max(dp[i|j][v],dp[i][v-1]+dp[j][1]);
                        ans=max(ans,dp[i|j][v]);
                    }
                }
            }
        }
        printf("%d\n",ans);

    }
}


        

数据集介绍:电力线目标检测数据集 一、基础信息 数据集名称:电力线目标检测数据集 图片数量: 训练集:2898张图片 验证集:263张图片 测试集:138张图片 总计:3299张图片 分类类别: 类别ID: 0(电力线) 标注格式: YOLO格式,包含对象标注信息,适用于目标检测任务。 数据格式:JPEG/PNG图片,来源于空中拍摄或监控视觉。 二、适用场景 电力设施监控与巡检: 数据集支持目标检测任务,帮助构建能够自动识别和定位电力线的AI模型,用于无人机或固定摄像头巡检,提升电力设施维护效率和安全性。 能源与公用事业管理: 集成至能源管理系统中,提供实时电力线检测功能,辅助进行风险 assessment 和预防性维护,优化能源分配。 计算机视觉算法研究: 支持目标检测技术在特定领域的应用研究,促进AI在能源和公用事业行业的创新与发展。 专业培训与教育: 数据集可用于电力行业培训课程,作为工程师和技术人员学习电力线检测与识别的重要资源。 三、数据集优势 标注精准可靠: 每张图片均经过专业标注,确保电力线对象的定位准确,适用于高精度模型训练。 数据多样性丰富: 包含多种环境下的电力线图片,如空中视角,覆盖不同场景条件,提升模型的泛化能力和鲁棒性。 任务适配性强: 标注格式兼容YOLO等主流深度学习框架,便于快速集成和模型开发,支持目标检测任务的直接应用。 实用价值突出: 专注于电力线检测,为智能电网、自动化巡检和能源设施监控提供关键数据支撑,具有较高的行业应用价值。
【弹簧阻尼器】基于卡尔曼滤波弹簧质量阻尼器系统噪声测量实时状态估计研究(Matlab代码实现)内容概要:本文围绕“基于卡尔曼滤波的弹簧质量阻尼器系统噪声测量与实时状态估计”展开研究,利用Matlab代码实现对系统状态的精确估计。重点在于应用卡尔曼滤波技术处理系统中存在的噪声干扰,提升对弹簧质量阻尼器系统动态行为的实时观测能力。文中详细阐述了系统建模、噪声特性分析及卡尔曼滤波算法的设计与实现过程,展示了滤波算法在抑制测量噪声、提高状态估计精度方面的有效性。同时,该研究属于更广泛的信号处理与状态估计技术应用范畴,适用于复杂动态系统的监控与控制。; 适合人群:具备一定控制系统理论基础和Matlab编程经验的高校研究生、科研人员及工程技术人员,尤其适合从事动态系统建模、状态估计与滤波算法研究的相关人员。; 使用场景及目标:①应用于机械、航空航天、自动化等领域中对振动系统状态的高精度实时估计;②为噪声环境下的传感器数据融合与状态预测提供算法支持;③作为卡尔曼滤波算法在实际物理系统中应用的教学与科研案例。; 阅读建议:建议读者结合Matlab代码实践,深入理解系统建模与滤波器设计的关键步骤,关注噪声建模与滤波参数调优对估计性能的影响,并可进一步拓展至扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)在非线性系统中的应用。
void Sort_CollegeScore(AllCollege *as) //按学院总分排序(直接插入排序) { int i,j,k; printf("\t|----------------------------------------------------------------|\n"); printf("\t|---- 学院编号\t|学院名字 |男团体总分|女团体总分|总分 |----|\n"); printf("\t|----------------------------------------------------------------|\n"); for (i = 2;i<as->College_num;i++) { as->College[0].boys_score = as->College[i].boys_score; as->College[0].girl_score = as->College[i].girl_score; as->College[0].shool_score = as->College[i].shool_score; as->College[0].College = as->College[i].College; strcpy(as->College[0].College_name,as->College[i].College_name); j = i - 1; while (as->College[0].shool_score < as->College[j].shool_score && j >0) { as->College[j+1].boys_score = as->College[j].boys_score; as->College[j+1].girl_score = as->College[j].girl_score; as->College[j+1].shool_score = as->College[j].shool_score; as->College[j+1].College = as->College[j].College; strcpy(as->College[j+1].College_name,as->College[j].College_name); j--; } as->College[j+1].boys_score = as->College[0].boys_score; as->College[j+1].girl_score = as->College[0].girl_score; as->College[j+1].shool_score = as->College[0].shool_score; as->College[j+1].College = as->College[0].College; strcpy(as->College[j+1].College_name,as->College[0].College_name); } for (k = 2;k<=as->College_num;k++) { printf("\t|---- %-9d|%-8s |%-4d\t|%-10d|%-8d|----|\n",as->College[k].College,as->College[k].College_name,as->College[k].boys_score,as->College[k].girl_score,as->College[k].shool_score); printf("\t|----------------------------------------------------------------|\n"); } printf("\n\n");system("pause"); }
06-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值