CodeTON Round 5 c ( dp

cpp 复制代码
#include<bits/stdc++.h>
using namespace std ;
using ll = long long;
using PII = pair<int,int>;
//using = pair<int,int>;
using VI = vector<int>;
const int mod = 10007;
const int limit = 30000;
int n,m,s;
int x;

int count_1(ll x){
    int res=0;
    while(x){
        res += x&1;
        x = x>>1;
    }
    return res;
}


void solve(){
    cin>>n;
    VI a(n+2);
    VI l(n+2,-0x3f3f3f3f);
    VI dp(n+2,0);
    for(int i=1;i<=n;i++) cin>>a[i];

    for(int i=1;i<=n;i++){
        dp[i] = dp[i-1];
        dp[i] = max(dp[i],i + l[a[i]]);
        l[a[i]] = max(l[a[i]] , dp[i-1]-i+1);
    }
    cout<<dp[n]<<"\n";
}

int main(){
    int t;
    cin>>t;
    while(t--){
        solve();

    }
}

先考虑构建一个朴素的做法

dpi = max(dpi-1 , dpj-1 + i - j +1) j <= i && aj == ai

很明显这是一个二重循环,但对于在一次 j 的循环中,dpj-1 + i - j +1 其中i是不变的,

所以只需要记录下每个数字的最大的 dpj-1 - j + 1 就可以在O(1) 时间内实现转移

相关推荐
轻颂呀36 分钟前
约瑟夫环问题
算法
凤凰院凶涛QAQ2 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
科技大视界2 小时前
投资AI项目,传统尽调不够用了——李章虎律师拆解算法、数据、算力三大雷区
人工智能·算法·数据挖掘
郝学胜-神的一滴3 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe3 小时前
算法滑动窗口
数据结构·算法
怪兽学LLM3 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:分治递归思路详解
算法·leetcode·职场和发展
可编程芯片开发3 小时前
基于PI控制的三相整流器控制系统的simulink建模与仿真,包含超级电容充电和电机
算法
酿情师3 小时前
区块链共识算法深度拆解:PoW、PoS、PBFT、Raft 原理解析
算法·区块链·共识算法
hansang_IR3 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法
退休倒计时4 小时前
【每日一题】LeetCode 39. 组合总和 TypeScript
算法·leetcode·typescript