洛谷 P1005 矩阵取数游戏

简介: 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的${n}\times{m}$的矩阵,矩阵中的每个元素${a}{_i}{_j}$均为非负整数。游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个。

题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的${n}\times{m}$的矩阵,矩阵中的每个元素${a}{_i}{_j}$均为非负整数。游戏规则如下:

1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;

2.每次取走的各个元素只能是该元素所在行的行首或行尾;

3.每次取数都有一个得分值,为每行取数的得分之和,$\mbox{每行取数的得分} = \mbox{被取走的元素值}\times{2^i}$,其中i表示第i次取数(从1开始编号);

4.游戏结束总得分为m次取数得分之和。

帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

输入输出格式

输入格式:

 

输入文件game.in包括n+1行:

第1行为两个用空格隔开的整数n和m。

第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开的非负整数。

数据范围:

60%的数据满足:1<=n, m<=30,答案不超过10^16

100%的数据满足:1<=n, m<=80,0<=${a}{_i}{_j}$<=1000

 

输出格式:

 

输出文件game.out仅包含1行,为一个整数,即输入矩阵取数后的最大得分。

 

输入输出样例

输入样例#1:
2 3
1 2 3
3 4 2
输出样例#1:
82

说明

NOIP 2007 提高第三题

吐槽

  一道DP练手题,2007年时这题是靠高精才撑到那么高的难度的……本题数据范围到$2^{90}$,long long不够,C++11里的__int128对付这题简直变态,最大$2^{128}$,于是这题松有……

  常年被大神鄙视,RP积攒了好多,写某些程序都自带小常数。这题我11ms,在洛谷恐怕是rank1了吧,即使不是也是前十(这题不在大牛分站,看不了排名)。翻了6页记录,200ms以内的全用__int128,其他版本的高精度耗时从230ms到2000ms不等。

解题思路

  不算高精度,就是一道简单的DP,我们发现每一行都可以独立计算,最后统计答案即可。对于每一行,我们用$f[i][j]$(LaTeX上瘾了)表示这行还剩下$[i,j]$时能得到的最高分,那么状态转移方程就显然了——$f[i][j]=max( f[i-1][j]+2^{m-j+i}*a[i-1] , f[i][j+1]+2^{m-j+i}*a[j+1] )$//上一步是从左取还是从右取呢?

  边界是j>=i,这时f[i][i]表示的只是a[i]两边都被取时的最大得分,要得到这一行取完的得分,还要加上$a[i]*2^{m}$。

  最后,__int128输出实在是坑,要写“快写”,还要特判0,第一个点答案是0,第一次没特判90分。

源代码

#include<bits/stdc++.h>
#define lll __int128
void print(lll x)
{
    if (x==0) return;
    if (x) print(x/10);
    putchar(x%10+'0');
}

int n,m;
lll ans=0;
int a[100]={0};
lll f[100][100];
lll p[100]={1};

lll dp()
{
    memset(f,0,sizeof(f));
    for(int i=1;i<=m;i++)
    {
        for(int j=m;j>=i;j--)
        {
            f[i][j]=std::max( f[i-1][j]+ p[m-j+i-1]*a[i-1]  , f[i][j+1]+ p[m-j+i-1]*a[j+1] );
        }
    }
    lll maxn=-1;
    for(int i=1;i<=m;i++) maxn=std::max(maxn,f[i][i]+a[i]*p[m]);
    return maxn;
}

int main()
{
    for(int i=1;i<=90;i++) p[i]=p[i-1]<<1;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            scanf("%d",a+j);
        ans+=dp();
    }
    if(ans==0) puts("0");
    else print(ans);
    return 0;
}

 

目录
相关文章
|
5月前
|
弹性计算 固态存储 应用服务中间件
阿里云服务器租用价格全解析:从入门到企业级云服务器配置收费标准与价格参考
阿里云服务器分为云服务器ECS和轻量应用服务器,轻量应用服务器2核2G峰值200M带宽40G ESSD云盘38元1年,经济型e云服务器2核2G3M带宽40G ESSD Entry云盘99元1年,通用算力型u1云服务器2核4G5M带宽80G ESSD Entry云盘199元1年。本文将详细解析阿里云服务器的价格体系,包括不同配置、不同实例类型的价格,以供参考和选择。
826 2
|
移动开发 前端开发 JavaScript
Vue与React两大前端框架的主要差异点
以上就是Vue和React的主要差异点,希望对你有所帮助。在选择使用哪一个框架时,需要根据项目的具体需求和团队的技术栈来决定。
695 83
|
5月前
|
人工智能 自然语言处理 安全
2025年中国数字人企业介绍与技术到场景创新及数字引擎推荐选择
2025年,AI数字人迈向实用化新阶段。面对短视频、直播电商等高效内容需求,选型需聚焦自动化、多语言支持、表情拟真、内容安全与成本透明五大原则,优先试用全功能平台,实现高效合规的内容生产与规模化落地。
|
7月前
|
数据采集 人工智能 搜索推荐
【微笑讲堂】成为GEO专家:入门指南与学习资源
大家好,我是微笑老师!本文分享如何成为GEO专家的入门指南与学习资源。随着AI重塑搜索生态,GEO正取代传统SEO,核心在于让内容被生成式AI“理解”与“推荐”。掌握E-E-A-T原则(经验、专业、权威、可信),提升内容质量,结合权威报告与实战打磨,才能在新时代脱颖而出。这是一场思维升级,更是抢占未来流量的关键。欢迎交流,一起进阶!(238字)
451 2
|
人工智能 Java 物联网
没有好的学历,Java开发未来的路应该怎么走?
在数字化时代,Java开发者即使没有高学历,也能通过拥抱新兴技术(如大模型应用与鸿蒙系统开发)、积累实战经验、持续学习新技能等途径实现职业突破。从参与开源项目到关注行业动态,再到规划技术专家或管理路线,建立人脉网络并利用教育平台提升能力,开发者可拓宽技术边界,适应日新月异的技术需求,在未来发展中占据一席之地。
|
9月前
|
存储 缓存 NoSQL
使用双 Bitmap实现签到和补签
在高并发场景下,采用双 Bitmap 实现签到与补签方案,具有内存占用低、操作效率高、并发安全等优势。通过 Redis 存储 Bitmap 数据,结合位运算实现签到记录与统计,可高效支撑大规模用户签到需求,适用于社交 APP、会员系统等场景。
|
人工智能 自然语言处理 程序员
来问我!看看通义灵码近期上新了哪些功能?
通义灵码近期上线了编程智能体,提供智能问答、文件编辑和智能体三种模式,满足不同开发场景需求。智能体会根据任务描述使用工程检索、文件编辑等工具完成复杂编码任务。同时,新增Qwen3系列模型服务,支持多模型配置,并优化上下文选择交互,强化记忆能力。此外,国际站支持阿里云账号登录,企业版可配置多个推理模型服务,进一步提升开发者体验。
603 17
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的明水县苹果网吧计费管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的明水县苹果网吧计费管理系统附带文章和源代码部署视频讲解等
277 1
|
机器学习/深度学习 搜索推荐 语音技术
前沿探索:融合语音克隆与TTS技术实现个性化语音助手
【10月更文挑战第20天】随着人工智能技术的迅猛发展,语音助手已经成为我们日常生活不可或缺的一部分。然而,传统的语音助手往往缺乏个性化元素,无法充分满足用户的独特需求。作为技术专家或研究人员,我一直致力于探索如何将语音克隆(Voice Cloning)技术与文本到语音(Text-to-Speech, TTS)技术相结合,创造出更加个性化且自然流畅的语音助手。本文将分享我的研究成果和个人观点,希望能为这一领域的未来发展提供一些启示。
779 2
前沿探索:融合语音克隆与TTS技术实现个性化语音助手
|
机器学习/深度学习 IDE 数据挖掘
使用VScode的几点感受,对比Pycharm、Jupyter优劣势
使用VScode的几点感受,对比Pycharm、Jupyter优劣势
2243 5