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) 时间内实现转移

相关推荐
Dream it possible!几秒前
LeetCode_热题100_知识点总结
算法·leetcode·职场和发展
鶴哥只手遮天1 分钟前
从像素到战场:红外场景仿真引擎的核心技术深度解析
算法
anew___3 分钟前
《从零手写操作系统 (19):Ext2文件系统实战——从内存到磁盘的跨越》
java·服务器·前端·数据库·算法
盘古开天16666 分钟前
PPO算法原理详解(上):从策略梯度到近端策略优化的演进之路
人工智能·算法·机器学习·强化学习·ppo
云栈开源日记7 分钟前
机器人运动规划从A*到Minimum Snap四大算法全解析
算法·ai·机器人
H.莓飛10 分钟前
【数据结构】栈
linux·开发语言·数据结构·算法·centos
我就是不信34 分钟前
C语言排序问题详解:从冒泡到快排的完整指南
c语言·算法·排序算法
l1t40 分钟前
DeepSeek总结的PIVCO-Huffman编码性能优化
数据结构·c++·算法
-dzk-1 小时前
【贪心算法】LC 763.划分字母区间
算法·贪心算法
拾饵9421 小时前
第六周第二节那个RAG工业项目遇到的问题
算法