当前位置: 首页 > news >正文

蓝桥云客 最大和

问题描述

小蓝在玩一个寻宝游戏,游戏在一条笔直的道路上进行,道路被分成了 n 个方格,依次编号 1 至 n,每个方格上都有一个宝物,宝物的分值是一个整数(包括正数、负数和零),当进入一个方格时即获得了方格中宝物的分值。小蓝可以获得的总分值是他从方格中获得的分值之和。

小蓝开始时站在方格 1 上并获得了方格 1 上宝物的分值,他要经过若干步 到达方格 n。

当小蓝站在方格 p 上时,他可以选择跳到 p+1 到 p+D(n−p) 这些方格 中的一个,其中 D(1)=1,D(x)(x>1) 定义为 x 的最小质因数。

给定每个方格中宝物的分值,请问小蓝能获得的最大总分值是多少。

输入格式

输入的第一行包含一个正整数 n。

第二行包含 n 个整数,依次表示每个方格中宝物的分值。

输出格式

输出一行包含一个整数,表示答案。

样例输入

5
1 -2 3 -1 5

样例输出

8

思路:


代码:

记忆化搜索

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], mem[N], primes[N], min_primes[N], cnt, n;
bool st[N];
void get_primes(int n) 
{
    for (int i = 2; i <= n; i++) 
	{
        if (!st[i]) 
		{
            primes[++cnt] = i;
            min_primes[i] = i; // 记录质数的最小质因数是其本身
        }
        for (int j = 1; primes[j] <= n / i; j++) 
		{
            st[primes[j] * i] = true;
            min_primes[primes[j] * i] = primes[j]; // 记录合数的最小质因数
            if (i % primes[j] == 0) 
			{
                break;
            }
        }
    }
}
// 计算 x 的最小质因数
int D(int x) 
{
    if (x == 1) return 1;
    if (min_primes[x])
        return min_primes[x];
    else 
	{
        cout << " 该数没有找到最小质因数 :" << endl;
        return 1e9;
    }
}

// 深度优先搜索并记忆化
int dfs(int x) 
{
    if (mem[x] != -1)
        return mem[x];
    if (x == n)
        return a[x];
    int sum = -1e9;
    for (int i = x + 1; i <= x + D(n - x) && i <= n ; i++) 
	{
        sum = max(sum, dfs(i));
    }
    mem[x] = sum + a[x];
    return mem[x];
}

int main() 
{
    cin >> n;
    get_primes(n);
    for (int i = 1; i <= n; i++) 
	{
        cin >> a[i];
    }
    memset(mem, -1, sizeof(mem));
    cout << dfs(1);
    return 0;
}    

dp:
 

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], dp[N], primes[N], cnt, n,min_primes[N];
bool st[N];
void get_primes(int n) 
{
    for (int i = 2; i <= n; i++) 
	{
        if (!st[i]) 
		{
            primes[++cnt] = i;
            min_primes[i] = i; // 记录质数的最小质因数是其本身
        }
        for (int j = 1; primes[j] <= n / i; j++) 
		{
            st[primes[j] * i] = true;
            min_primes[primes[j] * i] = primes[j]; // 记录合数的最小质因数
            if (i % primes[j] == 0) 
			{
                break;
            }
        }
    }
}
// 计算 x 的最小质因数
int D(int x) 
{
    if (x == 1) return 1;
    if (min_primes[x])
        return min_primes[x];
    else 
	{
        cout << " 该数没有找到最小质因数 :" << endl;
        return 1e9;
    }
}
int main(void)
{
    cin >> n;
    get_primes(n);
    for (int i = 1; i <= n; i++) 
	{
        cin >> a[i];
    }
    // 初始化 dp 数组
    for (int i = 1; i <= n; i++) 
	{
        dp[i] = -1e9;
    }
    dp[1] = a[1];
    // 动态规划计算
    for (int i = 2; i <= n; i++) 
	{
        for (int j = 1; j < i; j++) 
		{
            if (i <= j + D(n - j) && i <= n) 
			{
                dp[i] = max(dp[i], dp[j] + a[i]);
            }
        }
    }
    cout << dp[n];
    return 0;
}

http://www.dtcms.com/a/118183.html

相关文章:

  • Docker Compose 常用命令 运行 docker-compose.yaml
  • Tomcat 安装与配置:超详细指南
  • 使用 `china-region` 实现 Vue3 + TS 的省市区三级联动选择器
  • 【Node】如何使用PM2高效部署nodejs前端应用
  • 5G N2信令
  • Excel计数、求和、统计、计算类函数
  • AutoGLM 沉思智能体:开启 AI 自主决策新时代
  • Python开源项目月排行 2025年3月
  • C#调用C++动态库时出现`System.DllNotFoundException`错误的解决思路
  • int 与 Integer 的区别详解
  • Redis原理:keys命令
  • 微信小程序开发前端培训课程
  • 006 ElementUI
  • Redis7——进阶篇(八)
  • Unity Internal-ScreenSpaceShadows 分析
  • Spring Boot中使用RedisTemplate操作Redis的几种数据类型详解
  • 【C++ SIMD】第4篇:条件分支与掩码操作(Windows/VS2022版)——以AVX为例
  • 利用 Java 爬虫获取淘宝商品 SKU 详细信息
  • PyTorch使用(5)-张量索引操作
  • uniapp小程序生成海报/图片并保存分享
  • 集合学习内容总结
  • Chrome 135 版本新特性
  • YUESAI应急4G网络广播成功应用于绍兴市钱塘江观潮预警提示项目
  • 【9】搭建k8s集群系列(二进制部署)之安装work-node节点组件(kube-proxy)和网络组件calico
  • QT ARM开发板调试
  • 《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第二篇:项目创建和初始化
  • Linux时间函数3-strftime时间格式转换、asctime时间固定格式、asctime_r线程安全、strftime/asctime/ctime区别
  • 组合与括号生成(回溯)
  • 开源模型应用落地-Qwen2.5-Omni-7B模型-Gradio-部署 “光速” 指南(二)
  • 2012年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析