zoukankan      html  css  js  c++  java
  • dp总结

    一套dp专题训练题:http://vjudge.net/contest/view.action?cid=51495#overview

    A题:

    dp,然后根据每次dp的最优决策推出字符串

    状态:dp[i][j]表示从i到j需要补的括号数

    B题:

    状态:dp[i]表示买i个物品以后的所有物品的最小花费,则dp[i]=Min(dp[j]+(sum(i,j-1)+10)*b[j-1]);j>i;不解释。。

    C题:

    公式变形,然后dp,最后根据公式求结果;代码有点多,细心==;用引用优化代码量

    状态:dp[i][j][k][l][r]表示(j,k)到(l,r)这个矩形分i下所得到的平方和的最小值

    D题:

    数位dp,一般步骤为:

    先dp长度为i的满足条件的数的个数,然后dfs统计;

    状态:dp[i][0]表示长度为i,包含49的个数,dp[i][1]表示长度为i,不包含49的个数

    dp的计算:

    dp[i][0]=10*dp[i-1][0]+dp[i-2][1];

    dp[i][1]=10*dp[i-1][1]-dp[i-2][1];

    加法原理,保证包含所有情况且没有重复

    E题:

    经典的记忆化搜索,不解释==

    F题:

    经典问题,求最大子矩阵,思想是降维,转化为求最大子序列,o(n*n)*o(n)的时间复杂度

    G题:

    显然用二进制表示状态,然后递推统计即可,注意状态表示

    状态:dp[i][j][k]为前i行第i行的状态为j,第i-1行的状态为k的放的总数目,枚举第i-2行的状态,可求出dp[i][j][k];

    这里二维的状态表示是不可少的,一维会导致有后效性;另外要注意判断状态是否合法等等均可以预处理以节省时间

    H题:

    实际上是求两个序列的最长公共子序列,n最大60000多,不能直接二维dp,此题特殊在每个值都只出现一次,果断转化LIS求之

    I题:

    状态:dp[i][j]表示任一个玩家按最优决策在区间[i,j]里面得到的分,枚举做出的决策,得到状态转移方程:dp[i][j]=Max(sum(i,j)-dp(k,j)),k<=j+1

    dp的套路:

    无论哪种类型的dp,都是递推的思想,好的状态表示能轻松得出递推关系,有递推关系和初始值,进而逐步求得最终解

    dp的条件,无后效性(子问题“以前”的状态与当前状态无关,所以决策的时候要考虑所有与当前状态有关的子问题),最优子结构(子问题最优是不是全局最优)

  • 相关阅读:
    Mongodb创建自增序列
    在nagios上安装mongodb_check监控mongodb
    MongoDB分片
    Mondb remove justOne
    Mongos cannot do slaveOk queries when primary is down
    MongoDB聚合操作
    MongoDB副本集(三)
    MongoDB副本集(二)
    CMD命令
    计算机网络实用技术第一章随笔
  • 原文地址:https://www.cnblogs.com/jklongint/p/3883921.html
Copyright © 2011-2022 走看看