首页 > 其他分享 >DP查缺补漏之LIS状态记录

DP查缺补漏之LIS状态记录

时间:2023-11-10 11:13:03浏览次数:27  
标签:状态 补漏 记录 查缺 LIS DP

DP查缺补漏之\(LIS\)状态记录

前置知识

状态假设

\(F[i]\)为以\(a[i]\)为结尾的最长上升子序列长度。

状态转移

\(F[i] = max(F[j] + 1, F[i]) (j < i)\)

很好理解,即\(i\)之前的所有以\(a[j]\)结尾的最长上升子序列中取最大,再加上\(a[i]\)即加一。

代码实现

for (int i = 1; i <= n; i++) F[i] = 1;
for (int i = 1; i <= n; i++)
{
	for (int j = 1; j < i; j++)
    {
		if (a[j] < a[i])
        {
            F[i] = max(F[i], F[j] + 1);
        }
    }
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
	ans = max(ans, F[i]);
}

状态记录

基本思路

再开一个数组维护每个最长上升子序列,利用状态转移的思想记录最优解。

代码实现

for (int i = 1; i <= n; i++)
{
	for (int j = 1; j < i; j++)
    {
		if (a[j] < a[i] && F[i] < F[j] + 1)
        {
            F[i] = F[j] + 1;
            tag[i] = j;
        }
    }
}

int p = 1;

for (int i = 1; i <= n; i++)
{
	if (F[p] < F[i])
    {
		p = i;
    }
}

for (int i = 0; i < F[p]; i++)
{
    cout << a[p];
    p = tag[p];
}

标签:状态,补漏,记录,查缺,LIS,DP
From: https://www.cnblogs.com/kdlyh/p/17823616.html

相关文章

  • List的遍历
    List的遍历方式迭代器遍历,普通for遍历,增强for遍历,Lamda遍历,列表迭代器遍历演示代码如下publicclassMain{publicstaticvoidmain(Stringa[]){List<String>list=newArrayList<>();list.add("zhang");list.add("wang");......
  • Set&List&Map
    Map概述Anobjectthatmapskeystovalues.Amapcannotcontainduplicatekeys;eachkeycanmaptoatmostonevalue.Map将key映射到value;Map的key不能重复,每个key只能映射一个value;Thisinterfacetakestheplaceofthe<tt>Dictionary</tt>class,whichwasa......
  • 谷歌正为 Android 平台 Chrome 浏览器设计“Polish”主页
    敢兴趣的小伙伴们,可以在浏览器中访问以下网址启用:chrome://flags/#enable-surface-polish据悉,相关主页也存在于Chrome的稳定版本中,但只有带有低对比度的方形搜索栏的早期版本,而最完整的版本可以在ChromeDev和Canary中找到。​​‍​​......
  • 谷歌正为 Android 平台 Chrome 浏览器设计“Polish”主页
    敢兴趣的小伙伴们,可以在浏览器中访问以下网址启用:chrome://flags/#enable-surface-polish据悉,相关主页也存在于Chrome的稳定版本中,但只有带有低对比度的方形搜索栏的早期版本,而最完整的版本可以在ChromeDev和Canary中找到。​​‍​​......
  • 无涯教程-批处理 - For 语句 - List Implementations函数
    "for"构造为批处理文件提供循环功能,以下是用于处理值列表的"for"语句的常见结构。FOR%%variableINlistDOdo_something经典的"for"语句由以下部分组成-variable变量    -对于整个循环,此步骤仅执行一次,并用于声明将在循环中使用的任何变量,在批处理脚本中变量声......
  • An established connection was aborted by the software in your host machine
    TrytoconnecttotheserverviaTelnettoverifyyoucangettotheportoutsideofyourapplication.Tryopeningupacommandprompt,typing"telnet",thenintelnet,typethefollowing:open<iporaddressofserver>25Thisshou......
  • 'ddlCities' has a SelectedValue which is invalid because it does not exist in th
    this.ddlCities.DataSource=GetAll_List();this.ddlCities.DataTextField="Name";this.ddlCities.DataValueField="Id";this.ddlCities.DataBind();错误:'ddlCities'hasaSelectedValuewhichisinvalidbecauseitdoe......
  • 线程安全集合(JDK1.5之前和之后)、CopyOnWriteArrayList、CopyOnWriteArraySet
    JDK1.5之前JDK1.5之前:Collections.synchronizedList JDK1.5之后CopyOnWriteArrayList   CopyOnWriteArraySet    ......
  • CMake多个CMakeLists.txt共同合作编译一个C++项目
    一、概述在C++项目比较大或者要根据不同的规则生成不同的执行文件或者动态库/静态库的时候。单独的CMakeLists.txt会变的比较复杂,此时可以利用CMakeLists.txt的父子关系分目录分模块的进行编译及输出。就相当于项目模块化编译参考博客:【大丙课堂】二、具体实现......
  • ArrayList的contains()方法的性能问题及优化方法
    背景今天定位一个接口耗时问题,通过日志定位到在数据库查询完毕后,中间一段逻辑耗时很长有十几秒的样子,发现是循环中使用ArraysList中的contains方法,当循环数量级变得很大时,执行时间变得不可控。代码示例//有5万个门店List<Store>storeList=storeMapper.se......