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/

结合状态机,且需要输出路径,考验代码能力和综合能力。

posted @ 2021-04-30 11:38  _rhinoceros  阅读(104)  评论(0)    收藏  举报