如果dp写的不对请指出,我是蒟蒻(
by sumlen @ 2023-10-03 16:59:09
内层循环是从 $1$ 到 $m$。
by modfish @ 2023-10-03 16:59:59
@[modfish](/user/605226) 大佬!还是爆零啊!
by sumlen @ 2023-10-03 19:25:33
下标是从 $0$ 开始的。
其实只要把你的第零行和第零列在循环外初始化一下就行了。
比如这样(这里只是列的初始化):
```cpp
for(int i = 0; i <= n; i ++){
if(cant(x, y, i, 0)) break; //这里的cant()是用来算卒能不能走的
dp[i][0] = 1;
}
```
然后两层循环内就只需要一句:
```cpp
if(!cant(x, y, i, j)) dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
```
就可以了。
by modfish @ 2023-10-03 19:36:30
@[modfish](/user/605226) 爆了三个点
```
#include <bits/stdc++.h>
using namespace std;
int mx[9], my[9];
int dp[30][30];
int n, m;
bool cheek(int x, int y) {
for (int i = 0; i <= 8; i++) {
if (x == mx[i] && y == my[i])
return 1;
}
return 0;
}
int main() {
cin >> n >> m >> mx[0] >> my[0];
mx[1] = mx[0] - 2, my[1] = my[0] - 1;
mx[2] = mx[0] - 2, my[2] = my[0] + 1;
mx[3] = mx[0] - 1, my[3] = my[0] - 2;
mx[4] = mx[0] - 1, my[4] = my[0] + 2;
mx[5] = mx[0] + 2, my[5] = my[0] - 1;
mx[6] = mx[0] + 2, my[6] = my[0] + 1;
mx[7] = mx[0] + 1, my[7] = my[0] - 2;
mx[8] = mx[0] + 1, my[8] = my[0] + 2;
for (int i = 0; i <= n; i ++) {
if (cheek( i, 0))
break;
dp[i][0] = 1;
}
for (int i = 0; i <= m; i ++) {
if (cheek( 0, i))
break;
dp[0][i] = 1;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (!cheek(i, j))
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
cout << dp[n][m];
return 0;
}
```
by sumlen @ 2023-10-04 15:28:32
@[sumlen](/user/723796)
```cpp
for (int j = 1; j <= n; j++)
```
你这句不还是没改过来吗……
by modfish @ 2023-10-04 20:57:45
@[modfish](/user/605226) byd我傻了
by sumlen @ 2023-10-05 08:46:17
@[modfish](/user/605226) byd又爆了,60分 红的34
```
#include <bits/stdc++.h>
using namespace std;
int mx[9], my[9];
int dp[30][30];
int n, m;
bool cheek(int x, int y) {
for (int i = 0; i <= 8; i++) {
if (x == mx[i] && y == my[i])
return 1;
}
return 0;
}
int main() {
cin >> n >> m >> mx[0] >> my[0];
mx[1] = mx[0] - 2, my[1] = my[0] - 1;
mx[2] = mx[0] - 2, my[2] = my[0] + 1;
mx[3] = mx[0] - 1, my[3] = my[0] - 2;
mx[4] = mx[0] - 1, my[4] = my[0] + 2;
mx[5] = mx[0] + 2, my[5] = my[0] - 1;
mx[6] = mx[0] + 2, my[6] = my[0] + 1;
mx[7] = mx[0] + 1, my[7] = my[0] - 2;
mx[8] = mx[0] + 1, my[8] = my[0] + 2;
for (int i = 0; i <= n; i ++) {
if (cheek( i, 0))
break;
dp[i][0] = 1;
}
for (int i = 0; i <= m; i ++) {
if (cheek( 0, i))
break;
dp[0][i] = 1;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!cheek(i, j))
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
cout << dp[n][m];
return 0;
}
```
by sumlen @ 2023-10-05 08:49:19
@[modfish](/user/605226) 过了过了,我tm不开long long见祖宗了
by sumlen @ 2023-10-05 09:00:31