洛谷P1002 [NOIP 2002 普及组] 过河卒(线性dp)(基础性思想)
题目来源:https://www.luogu.com.cn/problem/P1002
这道题的基础框架:
for (int i = 0; i <= n; i++) { for (int j = 0; j <= m; j++) { if (i == 0 && j == 0) continue; if (mp[i][j] == 1) { dp[i][j] = 0; continue; } dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } }
为什么这样遍历成立? :卒只能向下、向右,而我们遍历是从上到下、从左到右。每碰到一个新点{i,j},它要么从上、要么从左转移过来,而遍历顺序来看,它的上位和左位的点一定在它之前已经处理过了。
进一步处理起始和边界
`dp[0][0] = 1;
if (i == 0) { dp[i][j] = dp[i][j - 1]; continue; }
if (j == 0) { dp[i][j] = dp[i - 1][j]; continue; }`
这里不处理的话dp[i-1][j]就会搞出来-1索引
最后有两个点没过,查找发现是没开long long,
!注意:dp如果是计数那么通常会结果很大,一定开long long

浙公网安备 33010602011771号