luogu_p1514 记忆化搜索 与 贪心
题面
给定一个N*M的矩形,从第一行的任意多个单位格子出发,进行下降且含有公共边的染色,问是否能够将最后一行格子全部染色,若能够
求出满足条件下的最少出发格子数,若不满足条件,输出最后一行未被染色的格子数量。
思路:
第一行每个格子搜索一次,并求出每个格子所能染色的**最左区间和最右区间**,而不需要求出每个格子所能染色的每一个点,
因为如果能够满足题意,则每个格子染色的区间一定是连续的,否则一定不能全部染色,可用反证法证得。这里需要注意一下,求最左区间和最右区间的时候
对于l[N][N]和r[N][N]的初始化。
至于最小格子数,可以通过贪心来求解。
算法复杂度,染色采用记忆化,复杂度是O(N+E)。最小方案,排序是O(NlogN),遍历是O(N)。
luogu_p1508 裸DP
题面
n*m个小方格,每个方格有一定价值(含负值)在最后一行的中间位置下方有一个点,从该点出发,向上/左前方/右前方出发,直到到达另外一侧,求获得的最大能量。
思路:
读题首先容易发现存在最优子结构,以及无后效性,显然可以用DP求解。
状态设计:dp[i][j] 表示在(i,j)位置可以获得的最大能量。
转移方程:\dp[i][j] = max {dp[i-1][j],dp[i-1][j+1],dp[i-1][j-1]}
最后求解 : max{dp[n][m/2+1],dp[n][m/2],dp[n][m/2+2]}
值得注意的是:一行的中间是 m/2+1 而不是 m/2。
luogu_p1006 DP(四维或者三维)
题面
n*m个小方格,每个方格有一定价值(0~100),问从(1,1)到(n,n)有两条不相交的路径(除起点、终点)
的路径价值和的最大值。每一步只能向下或者向右移动.(1,1)与(n,n)的价值为0。
思路:
由于每一步只能向下向右,所以两条路的最后一个不重点,一定是(n-1,m)与(n,m-1);
状态设计:dp[i][j][k][l]表示第一条路线到达(i,j),第二条路线到达(k,l)的最大价值。
转移方程:\dp[i][j][k][l] = max {dp[i-1][j][k-1][l],dp[i][j-1][k-1][l],dp[i-1][j][k-1][l],dp[i][j-1][k][l]}+ v[i][j]+v[k][l]
最后求解 : max{dp[n-1][m][n][m-1],dp[n][m-1][n-1][m]}
需要注意的是,为了保证两条路线不会重复,需要在遍历的时候保证 j 与l 不相同。
三维解法是利用dp[i][j]][p] ,其中i,j代表两个路径所在行,p代表步数,这样也就确定了点。之所以能够用这个方法
是由于走向只能是向下或者向右,而不会出现“反复横跳”的现象。
luogu_p1387 DP(正方形的子结构)
题面
在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。
思路:
状态设计:dp[i][j]表示最大以(i,j)为左定点的正方形边长。
**转移方程:if (v[i][j] == 1) dp[i][j] = min{dp[i+1][j],dp[i][j+1],dp[i+1][j+1]}+1 **
正方形的DP思路其实是挺有意思的。