网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月25日漏签0天
c语言吧 关注:801,652贴子:4,374,669
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 13回复贴,共1页
<<返回c语言吧
>0< 加载中...

求助,关于动态规划如何学习

  • 只看楼主
  • 收藏

  • 回复
  • 淼家尔州
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
根本不会,看视频看书永远处于似懂非懂的状态,线性dp做的最多的是计算路线最优,比较好做,过河卒过了,学了下01背包dp,过了采药P1048,但是一旦换一种类型的就完全搞不懂,我知道dp是将大问题分解成最优子问题来做的,所以做题时也尽量想着去找子问题,找状态转移方程,结果发现问题过于抽象无法理解,题目的状态是什么也搞不清楚,比如B4426 lol串,我看半天都不知道要利用分割点将字符串分割成三个小串,更别提计算代价和找方程了。总感觉自己在做dp题时永远是被人牵着鼻子走的,看到题甚至连思路都没有,求各位佬救救孩子吧


  • 贴吧用户_JRPybAS
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
插个眼


2025-12-25 19:44:47
广告
不感兴趣
开通SVIP免广告
  • 二阶导真红
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
cy


  • 我就要大拉
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
戒骄戒躁,学就完了


  • 草酱
  • 马猴烧酒
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
见一个记一个就完了,都是套路题


  • Zllllx
  • 路人
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
背


  • 逢部祝
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
学动态规划之前,要先学会打暴力。
比如说IOI串,今年的山东CSP小学组第二题,这类题目如果打暴力,要怎么做?
最暴力的解法是枚举所有长度是n的IO串,然后判断题目给的串改成这个串代价是多少,复杂度n*2^n;
稍微一想就会发现,题目要求里满足条件的串其实没那么多,那就想想满足IOI这样形式的串一共有多少种,I和O的分界点是区分不同IOI串的关键,它有n^2个,加上和输入串的对比,复杂度从上一个方法降到了n^3
再进一步,并不是非得把结果的IOI串构造出来,才能知道输入串改过去的代价是多少,结果IOI串的形式就是下标i之前和j之后是I,中间是O,只需要统计输入串这三个区间里I和O各自的数量,用前缀和的方法可以把这个解法优化到n^2
此时才到了考虑动态规划的时候,上一个解法说到的3个区间,就是解决这个问题的阶段划分:先把第一个区间的I改好,再把第二个区间的O改好,最后改第三个区间的I。字符是从左到右一个一个改过去的,后面改的字符不影响之前的决策,所以动态规划的两个维度就出来了,这样复杂度降到n
楼主可以看看自己的思路卡在哪一个解法上,连暴力拿部分分数都做不到的话,就先不要什么题都试图用dp做


  • 香菜味包子
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如果i+1的状态需要i和i-1的状态作为条件,这样如果计算n+1的状态就需要计算n和n-1的状态,计算n的状态就需要计算n-1和n-2的状态,这样n-1的状态就重复计算了
动态规划的原理是:
如果已经计算出了k的状态,就直接把这个状态缓存下来,下次需要计算这个状态时直接从缓存里取这个值,就省去了重新计算k的状态的操作
需要重复计算的项越多,动态规划的效果就越好,如果i+1状态只和i状态有关,那么动态规划基本就没有性能提升
拿最简单的动态规划的斐波拉契数列举例子:
暴力解是:
int fib(int n){
if (n == 1 || n == 2){
return 1;
}
return fib(n-1) + fib(n-2);
}
这样
1. 计算fib(5),就需要计算fib(3)和fib(4);
2. 计算fib(3)需要计算fib(1)和fib(2),计算fib(4)需要计算fib(3)和fib(2)
3. 计算fib(3)需要计算fib(1)和fib(2)
这样fib(3)就重复计算了1次
n越大,重复计算的次数就越多
如果使用一个缓存来保存中间的计算步骤,就可以省去很多重复的计算:
int fib(int n){
static int arr[100] = {0,1,1};
if(arr[n] == 0){//如果已经计算过n
arr[n] = fib(n-1) + fib(n-2);
}
return arr[n];
}
把尾递归改成循环:
int fib(int n){
static int arr[100] = {0,1,1};
static int index = 2;
while(index < n){
arr[index+1] = arr[index] + arr[index-1];
}
return arr[n];
}
这就是一个常规意义上的动态规划的版本了。


2025-12-25 19:38:47
广告
不感兴趣
开通SVIP免广告
  • 香菜味包子
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
IOI 串的问题:很容易看出来题目是要求把一个数组变成I..IO..OI..I的状态
假设第i个位置是O的起点,第J个位置是第二个I的起点
暴力解就是:
for(int i = 1; i < size-1; i++) {
for(int j = i+1; j < size; j++) {
统计:
a = [0,i)中O的数量
b = [i,j)中I的数量
c = [j,size)中O的数量
}
}
结果就是a+b+c
显然IO的数量可以用前缀和优化重复计算的问题


  • 若葉大麥漿
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
动态规划顾名思义就是动态做规划,从一个分支回溯上来的过程中,重新做下规划,好让下次搜索少走点弯路,要从头想明白这些本来就不简单,见的多了思路才多


  • 电饭鸡煲
  • 便当
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可以想最后一步确定状态转移,根据描述状态需要的信息来确定要记录什么状态


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 13回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示