随笔分类 - DP
            
    POJ 2288 汉密尔顿回路 DP解决
    
            
            
        
摘要:题目大意:有n个岛屿,令Vi为岛屿Ci的权值。一条汉密尔顿路径C1,C2,C3...Cn的值为3部分第一部分,将路径中的岛的权值相加,第二部分将每条边上的(Ci,Cj),加上所有的Vi*Vj第三部分,如果连续经过的3个城市可以形成3角联通,那么加上Vi*Vj*Vk求出一条路径使其权值最大,并记录有多...
        阅读全文
            
        
            
    POJ 3264 RMQ问题 用dp解决
    
            
            
        
摘要:1 #include 2 #include 3 #include 4 using namespace std; 5 const int N = 50010; 6 #define INF 0x3f3f3f3f 7 int maxn[N<<1][18] , minn[N<<1][18] , a[...
        阅读全文
            
        
            
    HDU1074 Doing Homework 状态压缩dp
    
            
            
        
摘要:题目大意:根据完成任务的截止时间,超时一天罚1分,求完成所有任务后的最小罚时这里n最大为15,可以利用状态压缩来解决问题 1 /* 2 首先要明白的一点是状态1/0分别表示这件事做了还是没做 3 而1/0的位置表示这是哪一件事 4 比如说 5 可以表示为101,那么表示第一个和第三个任务已经完成 5...
        阅读全文
            
        
            
    POJ 2479 两段连续最大和
    
            
            
        
摘要:题目大意:在一组数中,找到连续的两段 , 是这两段相加和达到最大这里利用dp[2][N]的数组保存所有的状态dp[0][i]表示取到第i个数时只取了一段的最大和,第i个数是一定要被取到的dp[1][i]表示取到第i个数时取了2段的最大和,第i个数是一定要被取到的而题目所求答案就是所有dp[1][i]...
        阅读全文
            
        
            
    HDU1024 多段最大和 DP
    
            
            
        
摘要:题目大意:在n个数,求不重复的m段中的数据总和的最大值令dp[i][j]表示将前j个数分成 i 段时得到的最大值(必取到第 j 个数)状态转移可列为 dp[i][j]=Max(dp[i][j-1]+a[j] , Max( dp[i-1][k] ) + a[j] ) 0 2 #include 3 #...
        阅读全文
            
        
            
    COJ 1351 Tree Counting 动态规划
    
            
            
        
摘要:题目大意是:给定一个n,k,表示树上共有n个节点,每个节点最多有k个叶子,问一共多少种摆法,答案对1000000007取模这里定义一个dp[i]表示 i 个节点对应有多少种方法f[i][j] 表示一个除去顶点的树中,这个顶点延伸出 j 个子树 , 这j个子树中共有i 个点那么只要在f[i][j]上添...
        阅读全文
            
        
            
    HDU 1130
    
            
            
        
摘要:题目大意给定节点数 , 求通过这么多个节点能得到的二叉树的组成方式用卡特兰数解决f[n] = (4*n-2) * f[n-1] / (n+1);递归不断解决 1 /** 2 * @(#)Main.java 3 * 4 * 5 * @author 6 * @version 1.00 201...
        阅读全文
            
        
            
    HDU 1244  DP
    
            
            
        
摘要:题目大意:我们需要将一串数字分成多个确定个数的连续段,在得到所有段的和的最大值定义一个dp[i][j]数组表示在前j个数中取满 i 个段所能得到的最大值那么也就是说明在这道题目当中每一段都是必须要被取到的能够取到的前提是 j >= cnt[i] //表示前 i 段的数字个数总和sum[i] 表示前 ...
        阅读全文
            
        
            
    HDU 1203 背包问题
    
            
            
        
摘要:题目大意:根据学校的申请费用,根据已有的钱得到最大的offer率这里很明显就是一个价值为概率的背包问题计算两个offer合并的概率 为a + b - a*b 1 #include 2 #include 3 #include 4 using namespace std; 5 const int ...
        阅读全文
            
        
            
    HDU 1176 DP
    
            
            
        
摘要:题目大意:在0~10这11个点上面接饼 , 每秒最多往左或往移动一格,或者保持原地不动令dp[i][j]表示在第 i 秒在 第 j 个点上最多能得到的饼的数量dp[i][j] = max(dp[i-1][j] , dp[i-1][j-1] , dp[i-1][j+1]) + a[i][j] //a[...
        阅读全文
            
        
            
    HDU 1160 排序或者通过最短路两种方法解决
    
            
            
        
摘要:题目大意:给定一堆点,具有x,y两个值找到一组最多的序列,保证点由前到后,x严格上升,y严格下降,并把最大的数目和这一组根据点的编号输出来这里用两种方法来求解:1.我们可以一开始就将数组根据x由大到小排个序,由前往后取,保证x严格上升了只要每次取得过程中找一条x不相等的关于y的最长下降子序列即可,加...
        阅读全文
            
        
            
    最长上升子序列的回溯 ZOJ 2432
    
            
            
        
摘要:题目大意:找一组最长上升公共子序列,并把任意一组满足的情况输出出来最长公共上升子序列不清楚可以先看这篇文章http://www.cnblogs.com/CSU3901130321/p/4182618.html然后在这基础上加回溯,我自己一开始利用两个一维数组写回溯,测了很多数据都没问题但一直给seg...
        阅读全文
            
        
            
    HDU 1423 最长上升公共子序列(LCIS)
    
            
            
        
摘要:题目大意:给定两个数字数组a[] , b[],在这两个数组中找一个最长的公共上升子序列,输出最长的长度从别人地方copy的= =LCIS理解:(1)f[i][j] 表示 a的前i,和b串前 j,以b[j]结尾的LCIS的长度;if(a[i]!=b[j) f[i][j]=f[i-1][j];else ...
        阅读全文
            
        
            
    HDU 1114 完全背包问题的转化
    
            
            
        
摘要:题目大意:根据存钱罐中钱的重量,和每一种钱对应的重量和价值,判断钱能否塞满这个重量,如果能,输出得到的最小价值这个问题就是要把它和背包问题连接起来,这里钱取得数目是无穷的,所以这里只需要用到完全背包来解决问题在这里我们定义dp[i][j] 作为重量 j 的条件下,取前 i 中硬币塞满背包可得到的最小...
        阅读全文
            
        
            
    HDU 1085 多重背包转化为0-1背包问题
    
            
            
        
摘要:题目大意:给定一堆1,2,5价值的硬币,给定三个数表示3种价值硬币的数量,任意取,找到一个最小的数无法取到总价值为M = v[i]*w[i](0 2 #include 3 4 using namespace std; 5 #define max(a,b) a>b?a:b 6 const int ...
        阅读全文
            
        
            
    HDU 1081 DP找最大和的矩阵
    
            
            
        
摘要:题目大意:在一个给定的大矩阵中找一个小型的矩阵,使这个矩阵中的元素和最大可以先来看下面这个问题: 原来有做过在一个给定的数字序列中找一个最大和子序列,核心代码如下: 1 int _max = num[0]; 2 int sum = num[0]; 3 ...
        阅读全文
            
        
            
    HDU 1059 多重背包问题
    
            
            
        
摘要:问题大意:有价值1-6的六种物品,分别规定其数目,问是否存在一种方法能使这些物品不拆分就能平均分给两个人 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int v[7] , ans , k; 7 int dp[5000...
        阅读全文
            
        
            
    HDU 1069
    
            
            
        
摘要:dp[i] 表示以第i块木块放在最顶端得到的最高高度dp[i] = max{dp[i] , dp[j]+block[i].h} j 2 #include 3 #include 4 #include 5 using namespace std; 6 #define N 1000 7 struct...
        阅读全文
            
        
            
    HDU 1058
    
            
            
        
摘要:利用一个数组 a[N]来保存自己所需要的数据,对于我们要得到a[i] , 那么a[i] 必然是由前i-1个数中的某一个,乘以2,3,5,7中的某个得到的最小值 1 #include 2 #include 3 #include 4 using namespace std; 5 6 #defin...
        阅读全文
            
        
            
    HDU 1025 最长上升子序列
    
            
    
摘要:首先根据第一个数排序,然后可以得到一串第二个数组成的序列,因为第一个由大到小排列,所以第二组中取到的数据,后面的不能比前面的小才不会形成交叉,那么也就是求这个新序列的最长公共子序列这里要用到最长上升子序列的nlogn的算法,新建一个数组保存所有合理的数据的数组g,比如g数组中有了1,4,6,加进来一...
        阅读全文
            
        
 
                     
                    
                 
                    
                 
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号