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();

    }
}

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

dp[i] = max(dp[i-1] , dp[j-1] + i - j +1) j <= i && a[j] == a[i]

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

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

相关推荐
敲代码的瓦龙11 分钟前
C++?继承!!!
c语言·开发语言·c++·windows·后端·算法
简简单单做算法14 分钟前
基于FPGA的二叉决策树cart算法verilog实现,训练环节采用MATLAB仿真
算法·决策树·fpga开发·cart算法·二叉决策树
白熊18826 分钟前
【机器学习基础】机器学习入门核心算法:K-近邻算法(K-Nearest Neighbors, KNN)
算法·机器学习·近邻算法
北京地铁1号线34 分钟前
MMdetection推理验证输出详解(单张图片demo)
前端·算法
oioihoii1 小时前
C++23 新成员函数与字符串类型的改动
算法·c++23
似水এ᭄往昔1 小时前
【数据结构】——二叉树堆(下)
数据结构·算法
GG不是gg1 小时前
Prim算法剖析与py/cpp/java语言实现
算法
秋山落叶万岭花开ღ2 小时前
探索数据结构之顺序表:从入门到精通
数据结构·python·算法
这张生成的图像能检测吗2 小时前
OpenGAN:基于开放数据生成的开放集识别
人工智能·pytorch·深度学习·算法·机器学习·生成对抗网络·聚类
夕泠爱吃糖3 小时前
红黑树,B树,二叉树之间的不同
数据结构·算法·不同树的区别