博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 255C C. Almost Arithmetical Progression(dp)
阅读量:3712 次
发布时间:2019-05-21

本文共 909 字,大约阅读时间需要 3 分钟。

题目链接:


题目大意:

给出一个序列,求最长的子序列,满足隔位的两个数相等,问这个最长的子序列的长度是多少。


题目分析:

  • 定义状态dp[i][j]代表以第i个数为末尾,第j个数为倒数第二个的情况下的最长子序列。
  • 转移的方法很简单:
    dp[i][j]=dp[j][k]+1(a[k]==a[i])
  • 其中k的找法很简单,直接在转移的过程中顺便找与a[i]相等的比当前位小的最大的那个。

AC代码:

#include 
#include
#include
#include
#define MAX 4007using namespace std;int dp[MAX][MAX];int a[MAX],n;int main ( ){ while ( ~scanf ( "%d" , &n ) ) { for ( int i = 1 ;i <= n ; i++ ) scanf ( "%d" , &a[i] ); int ans = 1; for ( int i = 1 ; i <= n ; i++ ) { int k = -1; for ( int j = 1 ; j < i ; j++ ) { if ( k == -1 ) dp[i][j] = 2; else dp[i][j] = dp[j][k] + 1; if ( a[j] == a[i] ) k = j; ans = max ( ans , dp[i][j] ); } } printf ( "%d\n" , ans ); }}

转载地址:http://jqvjn.baihongyu.com/

你可能感兴趣的文章
牛皮的异步非阻塞(webFlux)
查看>>
计算机网络总结(子网和模型)
查看>>
BCD码
查看>>
服务熔断
查看>>
springboot打war包无法发服务器报 ClassDefNotFoundError
查看>>
java注解源码解析
查看>>
动态语言
查看>>
Object源码解析
查看>>
得到 class 的常用方法(和 java内存模型)
查看>>
布隆过滤器
查看>>
redis key-value的设计原则
查看>>
redis客户端优化
查看>>
redis 字符串基本的理论
查看>>
HyperLogLog
查看>>
geo
查看>>
redis 数据持久化
查看>>
传输层总结
查看>>
TCP拥塞控制和滑动窗口
查看>>
文件传输协议
查看>>
雪崩效应
查看>>