首页 > 其他分享 >洛谷线性动态规划

洛谷线性动态规划

时间:2024-12-07 23:36:21浏览次数:3  
标签:动态 洛谷 卡片 int 电塔 爬行 样例 线性 81

P1541 [NOIP2010 提高组] 乌龟棋

[NOIP2010 提高组] 乌龟棋

题目背景

NOIP2010 提高组 T2

题目描述

小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。

乌龟棋的棋盘是一行 $N$ 个格子,每个格子上一个分数(非负整数)。棋盘第 $1$ 格是唯一的起点,第 $N$ 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。

乌龟棋中 $M$ 张爬行卡片,分成 $4$ 种不同的类型($M$ 张卡片中不一定包含所有 $4$ 种类型的卡片,见样例),每种类型的卡片上分别标有 $1,2,3,4$ 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。

游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。

很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。

现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?

输入格式

每行中两个数之间用一个空格隔开。

第 $1$ 行 $2$ 个正整数 $N,M$,分别表示棋盘格子数和爬行卡片数。

第 $2$ 行 $N$ 个非负整数,$a_1,a_2,…,a_N$,其中 $a_i$ 表示棋盘第 $i$ 个格子上的分数。

第 $3$ 行 $M$ 个整数,$b_1,b_2,…,b_M$,表示 $M$ 张爬行卡片上的数字。

输入数据保证到达终点时刚好用光 $M$ 张爬行卡片。

输出格式

一个整数,表示小明最多能得到的分数。

样例 #1

样例输入 #1

9 5
6 10 14 2 8 8 18 5 17
1 3 1 2 1

样例输出 #1

73

提示

每个测试点 1s。

小明使用爬行卡片顺序为 $1,1,3,1,2$,得到的分数为 $6+10+14+8+18+17=73$。注意,由于起点是 $1$,所以自动获得第 $1$ 格的分数 $6$。

对于 $30%$ 的数据有 $1≤N≤30,1≤M≤12$。

对于 $50%$ 的数据有 $1≤N≤120,1≤M≤50$,且 $4$ 种爬行卡片,每种卡片的张数不会超过 $20$。

对于 $100%$ 的数据有 $1≤N≤350,1≤M≤120$,且 $4$ 种爬行卡片,每种卡片的张数不会超过 $40$;$0≤a_i≤100,1≤i≤N,1≤b_i≤4,1≤i≤M$。

`//本题要求最多得多少分。集合可看作每种卡片拿。。。张,对应的分数和的集合的最大值。状态划分为四种:
//f(i-1,j,k,z),f(i,j-1,k,z),f(i,j,k-1,z),f(i,j,k,z-1)最后加上最后一步的分数然后取max.
//用一个计数器统计每种卡牌出现次数。

include

include

const int N = 100,M=360;
int f[N][N][N][N];
int n, m;
int a[M], b[M];
int v[M];
using namespace std;
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];// 分数
}
for (int i = 1; i <= m; i++)
{
cin >> b[i];
v[b[i]]++;
}
f[0][0][0][0] = a[1];//开始在第一格。
for (int i = 0; i <= v[1]; i++)//枚举每种步数多少张。
{
for (int j = 0; j <= v[2]; j++)
{
for (int k = 0; k <= v[3]; k++)
{
for (int z = 0; z <= v[4]; z++)
{
int u = 1 + i * 1 + j * 2 + k * 3 + z * 4;//计算步数
if (i!=0) f[i][j][k][z] = max(f[i][j][k][z], f[i - 1][j][k][z] + a[u]);//如果没有步数为一的
if (j!=0)f[i][j][k][z] = max(f[i][j][k][z], f[i][j - 1][k][z] + a[u]);
if (k!=0)f[i][j][k][z] = max(f[i][j][k][z], f[i][j][k-1][z] + a[u]);
if (z!=0)f[i][j][k][z] = max(f[i][j][k][z], f[i][j][k][z-1] + a[u]);
}
}
}
}
cout << f[v[1]][v[2]][v[3]][v[4]] << endl;

}`

P4933 大师

大师

题目背景

建筑大师最近在跟着数学大师 ljt12138 学数学,今天他学了等差数列,ljt12138 决定给他留一道练习题。

题目描述

ljt12138 首先建了 $n$ 个特斯拉电磁塔,这些电塔排成一排,从左到右依次标号为 $1$ 到 $n$,第 $i$ 个电塔的高度为 $h[i]$。

建筑大师需要从中选出一些电塔,然后这些电塔就会缩到地下去。这时候,如果留在地上的电塔的高度,从左向右构成了一个等差数列,那么这个选择方案就会被认为是美观的。

建筑大师需要求出,一共有多少种美观的选择方案,答案模 $998244353$。

注意,如果地上只留了一个或者两个电塔,那么这种方案也是美观的。地上没有电塔的方案被认为是不美观的。

同时也要注意,等差数列的公差也可以为负数。

输入格式

第一行一个正整数 $n$。

第二行 $n$ 个非负整数,第 $i$ 个整数是第 $i$ 个电塔的高度 $h[i]$。

输出格式

输出一个整数,表示美观的方案数模 $998244353$ 的值。

样例 #1

样例输入 #1

8
13 14 6 20 27 34 34 41

样例输出 #1

50

样例 #2

样例输入 #2

100
90 1004 171 99 1835 108 81 117 141 126 135 144 81 153 193 81 962 162 1493 171 1780 864 297 180 532 1781 189 1059 198 333 1593 824 207 1877 216 270 225 1131 336 1875 362 234 81 288 1550 243 463 1755 252 406 261 270 279 288 1393 261 1263 297 135 333 872 234 881 180 198 81 225 306 180 90 315 81 81 198 252 81 297 1336 1140 1238 81 198 297 661 81 1372 469 1132 81 126 324 333 342 81 351 481 279 1770 1225 549

样例输出 #2

11153

提示

设 $v$ 为最高的电塔高度。

对于前 $30%$ 的数据,$n \le 20 $。

对于前 $60%$ 的数据,$n \le 100$,$v \le 2 \times 10^3$。

对于另外 $20%$ 的数据,所有电塔的高度构成一个等差数列。

对于 $100%$ 的数据,$n \le 10^3$,$v \leq2 \times 10^4$。

集合:从前i个塔中选,其等差为h[i]-h[j]的所有情况。
状态可划分为f(j,h[i]-h[j])+1;//考虑最后一个状态的前一个状态。
最后模上998244353即可

`#include

include

include

const int N = 1010, M = 50010;
int h[N];
int f[N][M];
int n;
int res;

using namespace std;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> h[i];
}
for (int i = 1; i <= n; i++)
{
res++;
for (int j = 1; j < i; j++)
{

		f[i][h[i] - h[j]+20010] += f[j][h[i] - h[j]+20010] + 1;
		f[i][h[i] - h[j]+20010] %= 998244353;
		res = (res+f[j][h[i] - h[j]+20010]+1)%998244353;
	}
}
cout << res;








return 0;

}`

标签:动态,洛谷,卡片,int,电塔,爬行,样例,线性,81
From: https://www.cnblogs.com/lixinran1006/p/18590263

相关文章

  • POLIR-Society-阶层:发展一定是“社会的全阶层联动”的“动态发展”: **因为"农变新中
    这两人的"套路"都是"打工农的注意".不谈:怎么大富带先富,先富带中产。而是:将观众"注意力",导引到"房地产"。"农变新中产",必有"中产变先富","先富变大富";整体上的层层联动.因为"农变新中产"的收入,必来源于"部分非农";"农变中产"同时,这些非农必变"富或大富&qu......
  • 使用外站题目与数据(以洛谷和Loj为例)
    本食用方法以[NOIP2024]树上查询为例一、题目仅介绍洛谷食用方法在洛谷页面首先确保你有洛谷账号(非常重要,没有账号测试样例无法下载!)在左侧侧边栏点击“题库”,进入洛谷主题库进入题目P11364请点击题面右上角复制Markdown标签随后回到洛谷题面页面,查看并记......
  • 1 线性基练习题
    我更喜欢的是研究东西的乐趣。老年选手写不了代码了。悲。如何构造的理解这个对做题非常有帮助的。假设插入一个\(w\)维向量\(x\)(可以试做一个二进制下的01集合),我们的基每个位置有基底\(b_i\)(是一个\(w\)维向量)。我们希望把\(x\)融入\(b\)中来表示更多的数。从......
  • 算法描述:动态规划
    动态规划算法步骤:找出最优解的性质,刻画数据结构递归定义最优值自底向上计算出各子结构的最优值并添入表格中并保存以最优值构造最优解最长公共子序列递归结构:intLCSlength(char*a,char*b,int**len,int**flag)//a,b输入字符串,输出数组len的元素len[i][j]记录len(i,j),//......
  • 洛谷P10244 String Minimization 题解
    题目传送门思路本题就是让你求\(a\)字典序最小时的\(b\),毕竟他说在\(a\)的字典序尽量小的前提下。接下来就做这个判断:如果\(a_i\)<\(c_i\),则\(b_i\)和\(d_i\)交换。如果\(a_i\)<\(c_i\)且\(b_i\)>\(d_i\),则\(b_i\)和\(d_i\)交换。其余情况不用交换。......
  • 详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式
    地下城游戏题目链接:174.地下城游戏状态表示:按照以往题的表示,dp[i][j]表示:从起点(0,0)位置到达(i,j)位置时,所需的最小初始健康值。但是如果这么去表示,不仅要考虑到达(i,j)位置的最小初始健康值,由于魔法球的存在,还需要考虑到达(i,j)位置时的健康值,因为魔法球会对算后续位置的最小初始......
  • 运筹学笔记——求解线性规划人工变量法
    这学期学校开设了运筹学这门课,虽然之前已经对线性规划有过了解,但是几种求解方法则是新接触,写个笔记留作复习备用前面学习了单纯形法,在单纯形法中,我们考虑的是一个相对理想的情形,即约束条件的系数矩阵A中已包含应该m阶(m为约束条件个数)的单位矩阵。在这种情况下,取该单位矩阵......
  • 【题解】洛谷P6225: [eJOI2019] 异或橙子
    P6225[eJOI2019]异或橙子结论题,要手玩几组样例就懂了,发现长度为偶数的最后削为0,否则的话下标为奇数答案就是区间下标为奇数的异或和,偶数相同,所以考虑用两个树状数组分别维护下标奇偶数的异或前缀和,然后再异或区间。#include<bits/stdc++.h>//#defineintlonglong#define......
  • 【mybatis】动态SQL
    目录一、动态SQL的简述二、动态sql的使用1.标签---(注意:username和sex必须一个为空)2.--标签3.、标签--用来组装update语句4.、和标签5.标签①、用trim改写上面第二点的if+where语句 ②、用trim改写上面第三点的if+set 语句6.标签①:批量删除 ②......
  • Windows环境下,动态链接库(DLL)的“导入”与“导出”概念
    在软件开发中,特别是在使用动态链接库(DLL)的Windows环境下,"导入"(Import)和"导出"(Export)是两个关键概念,用于管理函数和变量在DLL之间的可见性和可用性。导出 (Export)当你创建一个DLL时,你可能会希望在这个DLL中定义一些函数或变量,使得其他的程序(客户端程序)或者其他的DLL能够调用或......