DP入门题目

来源:互联网 发布:淘宝vr眼镜 编辑:程序博客网 时间:2024/05/17 08:23

基本思想:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。

 

课堂题目:

1、斐波那契数列

题目描述:http://acm.hdu.edu.cn/showproblem.php?pid=2041

           有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

状态转移:dp[i]=dp[i-1]+dp[i-2];

2、数塔问题

         题目描述:http://acm.hdu.edu.cn/showproblem.php?pid=2084

有一个有非负整数组成的三角形,第一行一个数字,下面各行除了最后一行外,每行的每个数字下面左右各一个数字

状态转移方程:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];

                       dp[j]=max(dp[j],dp[j+1])+a[i][j];

3、Arithmetic Slices

         题目描述:https://leetcode.com/problems/arithmetic-slices/#/description

给你一个数组,求其中等差数列的个数 A = [1, 2, 3, 4] è [1, 2, 3], [2, 3, 4] ,[1, 2, 3, 4]

         状态转移:if(相邻三个是等差数列) dp=dp+1;

4、铺格子

         题目描述:http://acm.hdu.edu.cn/showproblem.php?pid=1143

In how many ways can you tile a 3xn rectangle with 2x1 dominoes?Here is a sample tiling of a 3x12 rectangle.

         状态转移:f(n)=f(n-2)*3+f(n-4)*2+...+f(2)*2+f(0)*2

                       f(n-2)=f(n-4)*3+f(n-6)*2+...+f(2)*2+f(0)*2

f[i]=4*f[i-2]-f[i-4]

5、01背包问题

         题目描述:http://acm.hdu.edu.cn/showproblem.php?pid=2602

有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

         状态转移:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

                             f[v]=max{f[v],f[v-cost]+weight}

6、完全背包问题

         题目描述:http://acm.hdu.edu.cn/showproblem.PHP?pid=1248

有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

         状态转移:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}

                             f[v]=max{f[v],f[v-cost]+weight}

7、多重背包问题

         题目描述:http://acm.hdu.edu.cn/showproblem.PHP?pid=2844

有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

         状态转移:结合01背包和完全背包

8、最长上升子序列

         题目描述:http://bailian.openjudge.cn/practice/2757/

给你一个长度为n的字符串,让你求出这个串的最长的子序列    

状态转移:if(a[i] >a[k])dp[i] = max(dp[i],dp[k]+1); 1<=k<=i-1;

9、最长公共子序列

         题目描述:http://acm.hdu.edu.cn/showproblem.PHP?pid=1159

给你两个字符串s1,s2,求最长公共子序列

         状态转移:dp[i][j]=dp[i-1][j-1]+1       (s1[i]==s2[j])

                             dp[i][j]=max(dp[i-1][j],dp[i][j-1])(s1[i]!=s2[j])

课后练习:

1、题目描述:http://acm.split.hdu.edu.cn/showproblem.php?pid=2018

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

状态转移:dp[i]=dp[i-1]+dp[i-3];

2、矩阵取数问题

         题目描述:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1083

一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值

         状态转移:dp[i][j]=max(dp[i-1][j],dp[i][j-1])+v[i][j];

3、题目描述:http://codeforces.com/problemset/problem/474/D

         有x朵花,其中有白花、红花不一。让你找出连续k朵花为白花的种数(当然x朵花里可以有多组k朵白花)。

现在让你找出a朵花~b朵花之间究竟有多少符合条件的。

         状态转移:dp[0]=1;

If(i>k) dp[i] = dp[i - 1] + dp[i - k];       i朵花时符合条件的种数

4、题目描述:http://acm.hdu.edu.cn/showproblem.PHP?pid=2191

假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,数量有限,其价格不等,并且只能整袋购买。
请问:你用有限的资金最多能采购多少公斤粮食呢?

多重背包

5、题目描述:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183

编辑距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

sitten (k->s)

sittin (e->i)

sitting (->g)

所以kitten和sitting的编辑距离是3。

状态转移:dp[i][j]=min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+((s1[i]==s2[j])?0:1));

6*、题目描述:http://acm.hdu.edu.cn/showproblem.php?pid=5904

求最长公共上升子序列

F[i][j]表示以a串的前i个字符b串的前j个字符且以b[j]为结尾构成的LCIS的长度

         状态转移:if(a[i]!=b[j]) F[i][j]=F[i-1][j]

                             if(a[i]==b[j])F[i][j]=max(F[i-1][k])+1   1<=k<=j-1&&b[j]>b[k]

 

原创粉丝点击