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

相关推荐
Rain的Java大神之路12 小时前
面了上百人,我最爱问的LeetCode 1「两数之和」:能背代码的很多,能讲清“先查后存”的没几个
java·后端·算法
Ivanqhz12 小时前
超参数考量与设计
数据库·人工智能·深度学习·算法·机器学习
雪落漂泊12 小时前
C++算法 滑动窗口篇(上)
开发语言·c++·算法
吞下星星的少年·-·12 小时前
Div.2 CF edu195A题(数学,贪心)
数学·算法·贪心
kiracrimson12 小时前
STL简单引入:把数据结构做成模板
开发语言·数据结构·c++
罗湖老棍子13 小时前
【例 2】牧场的安排(信息学奥赛一本通- P1593)三角形牧场(洛谷-P1284)
算法·动态规划·状压dp·状态压缩动态规划
HPtiger13 小时前
交换类排序详解:冒泡排序与快速排序
数据结构·算法·排序算法
kyle~13 小时前
数据结构 --- 无锁队列(Lock-Free Queue)
linux·数据结构·c++·多线程·并发
Cccp.12314 小时前
【leetcode】(十四)从暴力递归到动态规划
数据结构·算法·leetcode·动态规划
旖旎夜光14 小时前
LeetCode 215: 数组中的第K个最大元素 (快速排序) —— 题解
c++·学习·算法·leetcode·力控