DP知识点总结1 棋盘类线性DP(实时更新)
一、从简单题开始
1.运筹学都学过的逆推求线性DP
P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
https://www.luogu.com.cn/problem/P1216
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int r,a[1002][1002],F[1002][1002]; 5 main() 6 { 7 scanf("%d",&r); 8 for(int i=1;i<=r;i++) 9 for(int j=1;j<=i;j++) 10 { 11 scanf("%d",&a[i][j]); 12 F[i][j]=a[i][j]; 13 } 14 for(int i=r-1;i>0;i--) 15 for(int j=1;j<=i;j++) 16 F[i][j]+=max(F[i+1][j],F[i+1][j+1]); 17 printf("%d",F[1][1]); 18 }
2.卒子问题,一般是在棋盘中,卒子从(1,1)走到(n,m)
https://www.acwing.com/problem/content/1017/
代码略
二、一些进阶变体
1.方格取数
https://www.acwing.com/problem/content/1029/
需要统计的变量更多,但原先框架不变
2.传纸条
https://www.acwing.com/problem/content/277/
增加思维技巧,从终点传回可以看做从起点再传一次。
3.杨老师的照相排列
https://www.acwing.com/problem/content/273/
需要发现性质,首先按照数字从小到大加入,则新加入的人数字一定比以往的要大,则新加入的一定是排在以往已填数的右边。又由于已经发现的性质(行是紧密的,以及每行人必然递减),因而每次新加入的数必然在每一行的最右边,且新加入数不会破坏整体的性质。以此为基础进行每次的决策,从而构造状态转移过程,得解。这个性质广泛应用于很多线性DP的状态转移中。
4.I-区域
https://www.acwing.com/problem/content/278/
结合状态机,且需要输出路径,考验代码能力和综合能力。