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

相关推荐
青蓝智慧马老师1 分钟前
想学数据分析但零基础,正确顺序不是先学 Python
大数据·人工智能·算法
jeo陽18 分钟前
05-数组与冒泡排序:第一个数据结构与经典算法
c语言·数据结构·算法
鸽鸽程序猿26 分钟前
【刷题册】hot21-25
算法
Keven_1130 分钟前
算法札记:记忆化搜索中面对多组数据的初始化
算法
happyprince32 分钟前
02-具体观 · JevAny算法与实现剖析
人工智能·算法
Nil20835 分钟前
leetcode 75颜色分类
数据结构·算法·leetcode
Liaiyang6641 分钟前
空圈容错视角 · 多维切面篇:我们生活的世界,不止三维
人工智能·算法·系统架构·前沿技术·哲学·认知科学
闻缺陷则喜何志丹1 小时前
【环】P6709 [CCC 2020] Swapping Seats 环|普及+
算法·洛谷·环
开开心心就好1 小时前
打印机卡住打不了?一键清理卡死打印队列
服务器·开发语言·算法·pdf·ocr·idea·visual studio code
格物致胜工业数智技术1 小时前
锂电纠偏测量那些坑,明治ETD-0612激光纠偏传感器怎么填?
人工智能·算法