Pokémon Army (easy version) CodeForces - 1420C1 dp
2024-09-07 04:56:37
题意:
给你一个长度为n个序列v,你需要从中找一个子序列。这个子序列的值等于:子序列中奇数下标的值-偶数下标的值
你需要使得这个值尽可能大,让你输出这个最大值
题解:
dp[i][0]表示:在原序列从1到i位置中找一个子序列,这个子序列长度为偶数的子序列最大值
dp[i][1]表示:在原序列从1到i位置中找一个子序列,这个子序列长度为奇数的子序列最大值
初始化:
dp[i][0]=0
dp[i][1]=v[i]
转移方程:
1、dp[i][0]=max(dp[i-1][1]-v[i],dp[i-1][0]);
它的值或着是继承上一个dp[i-1][0],或者是由之前的奇数长度再加上vi构成一个偶数长度序列dp[i-1][1]-vi
dp[i][1]=max(dp[i][1],max(dp[i-1][0]+v[i],dp[i-1][1]));
它的值可以由本身得到(因为它可以不取之前的序列,它自己就能构成一个长度为1的子序列),或者是继承上一个dp[i-1][1],或者是由之前的偶数长度再加上vi构成一个奇数长度序列dp[i-1][0]+vi
代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=3e5+10;
ll v[maxn],q[maxn][2];
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
ll n,m;
scanf("%lld%lld",&n,&m);
ll maxx=0;
for(ll i=1;i<=n;++i)
{
scanf("%lld",&q[i][1]);
v[i]=q[i][1];
q[i][0]=0;
}
//printf("%lld %lld\n",q[1][0],q[1][1]);
for(ll i=2;i<=n;++i)
{
q[i][0]=max(q[i-1][1]-v[i],q[i-1][0]); //1 3 2
q[i][1]=max(q[i][1],max(q[i-1][0]+v[i],q[i-1][1]));
//printf("%lld %lld\n",q[i-1][0],q[i-1][1]);
}
printf("%lld\n",max(q[n][1],q[n][0]));
}
return 0;
}
最新文章
- Python开发程序:选课系统-改良版
- iOS设备的越狱方法
- 通过WMI - Win32_Processor - ProcessorId获取到的并不是CPU的序列号,也并不唯一
- 【转载】TalkingData首席金融行业专家鲍忠铁:18亿数据解读移动互联网
- UIView的一些常用属性和方法
- UNIX环境高级编程--高级I/O(三)
- 史上最全常用正则表达式(Javascript公众号推文)
- Java课程设计报告——学生成绩管理系统
- AI-认证
- vue Bus总线
- Robot Movement(机器人移动)
- RCC 和 RTC
- 一个神奇的BUG :Failed to finalize session : INSTALL_FAILED_INVALID_APK: /data/app/vmdl99393454.tmp/10_slice__ signatures are inconsistent
- Delphi 动态链接库的动态和静态调用 (仔细读一下)
- C++ 类中的静态成员变量,静态成员函数
- [CQOI2015]标识设计
- Chrome浏览器保存微信公众号文章中的图片
- 【python】if __name__ == &#39;__main__&#39;
- 算法笔记_091:蓝桥杯练习 递推求值(Java)
- temp8