关于dp方案记录的方法思考与优化

一般的方法是记录状态是从哪儿转移来的然后递归输出。

但是明显递归有爆栈的危险。

所以可以用一个 (增加理解难度而实际没用的) 方法来避免。

具体来说,用一个vector保存答案。

例如这一题中,一般题解是用

void print(int x,int y)
{
    if(pre[x][y]==y)
    {
        cout<<y<<" ";
        return;
    }

    print(x-1,pre[x][y]);
    cout<<y<<" ";//记得输出是逆序的
}

来输出的,而我用了

int x = F;
std::vector<int> v;
for(; x >= 1; y = pre[x][y], x--)
    v.push_back(y);

reverse(v.begin(), v.end());
cout<<ans<<endl;
for(int i = 0; i < (int) v.size(); i++)
    cout<<v[i]<<" ";
puts("");

来处理。

有什么用呢?增加代码长度与理解难度(笑)

原文地址:https://www.cnblogs.com/wsmrxc/p/8955572.html

时间: 2024-07-28 18:48:55

关于dp方案记录的方法思考与优化的相关文章

Nginx+Php中限制站点目录防止跨站的配置方案记录

Nginx+Php中限制站点目录防止跨站的配置方案记录(使用open_basedir)-------------------方法1)在Nginx配置文件中加入: 1 fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/:/proc/"; 通常nginx的站点配置文件里用了include fastcgi.conf;,这样的,把这行加在fastcgi.conf里就OK了.如果某个站点需要单独设置额外的目录,把上面的代码写在

MySQL删除重复记录的方法

参考网上的方法,总结了产出重复记录的方法,欢迎交流. 方法1:创建一个新表临时储存数据 假设我们有一个存在多个字段的表,表中有部分数据的若干字段重复,此时我们可以使用DISTINCT这个关键字对表数据进行筛选. 1 CREATE [TEMPORARY] TABLE temp LIKE origin_tb; 2 INSERT temp(attr1,attr2,...) SELECT DISTINCT attr1,attr2,... FROM origin_tb; 3 DELETE FROM ori

用一条SQL语句取出第 m 条到第 n 条记录的方法

原文:用一条SQL语句取出第 m 条到第 n 条记录的方法   --从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本) SELECT TOP n-m+1 * FROM Table WHERE (id NOT IN (SELECT TOP m-1 id FROM Table )) --从TABLE表中取出第m到n条记录 (Exists版本) SELECT TOP n-m+1 * FROM TABLE AS a WHERE Not Exists (Select * From 

SQL语句删除表中所有记录的方法

如何用一条sql语句删除表中的所有记录,这里分享下我的方法.参考链接: sql语句如何删除重复记录?四种方法 sql语句如何删除重复记录?教程详解 TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作. 语法TRUNCATE TABLE name 参数name 是要截断的表的名称或要删除其全部行的表的名称. 注释TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度

mysql使用GROUP BY分组实现取前N条记录的方法

MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: SELECT a.id,a.SName,a.ClsNo,a.Score FROM aa a LEFT JOIN aa b ON a.ClsNo=b.ClsNo AND a.Score<b.Score group by a.id,a.

查询数据库中重复记录的方法

select * from [DataBase].[dbo].[TableName] where [字段一] in (select [字段一] from [DataBase].[dbo].[TableName] group by [字段一] having count([字段一]) > 1) 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from peop

paip.取当天记录的方法sql跟hql hibernate

#------两个方法...函数法和日期计算法.. 函数法: DATEDIFF(d,createTime,GETDATE())=0   //d指定为day hb也有一样的函数.. 日期 计算法: where  createTime>='2014-5-4 00:00:01' and createTime<='2014-5-4 23:59:59' where  createTime='2014-5-4 00:00:00' 应该优先使用日期 计算法,,因为这个方法能使用索引了...不个日期时间转换为

HDU - 1160 FatMouse&#39;s Speed(dp+路径记录)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:给定x组老鼠的重量(W)和速度(S).求使得   W[m[1]] < W[m[2]] < ... < W[m[n]]       S[m[1]] > S[m[2]] > ... > S[m[n]] 的最长序列长度和路径 题解:排序一下,然后LIS,路径记录一下,输出就可以了 1 #include <iostream> 2 #include <a

记录每个方法的执行时间 AOP

package com.aop; import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class MyAspect { private static final Logger LOGGER=Logger.getLogger(MyAspect.class); //输出到指定文件 //private static f