Day1

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思路其实是挺有意思的。

posted @ 2019-09-02 23:04  Aackkom  阅读(156)  评论(1编辑  收藏  举报