知识点
递推是将一个大问题不断拆分成本质相同的子问题
递推的核心在于递推式,即如何用已知数据更新新数据
递推可以正推,也可以逆推
如何解题
解题的关键是找到转移式,f数组下标含义
一种可行的确定f数组的方法:情景分析法
假如你要向另一个人汇报,你汇报的重点(尽可能的少)就是下标与含义
如果无法写出转移式,尝试加(或减)一维
推导转移式方法:
分情况讨论,将大问题分成两个(或多个)情况下的子问题,最终将这些情况下的结果加到一起
注意:有时因题目变化需要额外加上特判
例题
例题3:传球游戏
- 要点:
注意循环嵌套的顺序,先枚举j,即经过人数,嵌套枚举i,即到第i人手中
原因:由递推式可知,每次更新需要用到 f[i-1][j-1] 和 f[i+1][j-1],所以要让每个 f[i][j-1] 有初始值,即每次有一个j,都要对j列上的所有数初始化,否则计算不能成功
所以要这样写:
f[1][0]=1;
for(int j=1;j<=m;j++){//枚举经过人数
for(int i=1;i<=n;i++){//枚举人
if(i==1) f[i][j]=f[n][j-1]+f[i+1][j-1];
else if(i==n) f[i][j]=f[1][j-1]+f[i-1][j-1];
else f[i][j]=f[i-1][j-1]+f[i+1][j-1];
}
}