P1176 路径计数2

P1176 路径计数2_第1张图片

网址如下:

P1176 路径计数2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

动归典中典

代码如下:

#include
using namespace std;
bool map[1001][1001];
int dp[1001][1001];

int main(void)
{
    //输入
    int N, M;
    cin >> N >> M;
    for(int i = 0; i < M; i++)
    {
        int n_tmpx, n_tmpy;
        cin >> n_tmpx >> n_tmpy;
        map[n_tmpx][n_tmpy] = true;
    }
    //动归
    dp[1][1] = 1;
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= N; j++)
        {
            if(!map[i][j])
                dp[i][j] += dp[i - 1][j] + dp[i][j - 1];
            dp[i][j] %= 100003;
        }
    //输出
    cout << dp[N][N];

    return 0;
}

做这题是因为我高中同学来问我

他不知道为什么没满分

他的代码如下:

#include
using namespace std;
int n, m;
int condition[1000][1000]{};
int dp[1000][1000];
bool w[1000][1000]{};
int count(int i, int j) {
	if (w[i][j]) {
		return dp[i][j];
	}
	else if (i == n - 1 && j == n - 1) {
		return 1;
	}
	else if (condition[i][j] == 1) {
		return 0;
	}
	else if (i == n || j == n) {
		return 0;
	}
	else {
		dp[i][j] = (count(i + 1, j) + count(i, j + 1)) % 100003;
		w[i][j] = 1;
		return dp[i][j];
	}
}
int main() {
	cin >> n >> m;
	int temp_x, temp_y;
	for (int i = 0; i < m; i++) {
		cin >> temp_x >> temp_y;
		condition[temp_x - 1][temp_y - 1] = 1;
	}
	cout << count(0, 0) << endl;
	return 0;
}

然后我给他改成这样:

#include
using namespace std;
int n, m;
int condition[1000][1000]{};
int dp[1000][1000];
bool w[1000][1000]{};
int count(int i, int j) {
	if(i == n || j == n)
		return 0;
	if (w[i][j]) {
		return dp[i][j];
	}
	else if (i == n - 1 && j == n - 1) {
		return 1;
	}
	else if (condition[i][j] == 1) {
		return 0;
	}
	else {
		dp[i][j] = (count(i + 1, j) + count(i, j + 1)) % 100003;
		w[i][j] = 1;
		return dp[i][j];
	}
}
int main() {
	cin >> n >> m;
	int temp_x, temp_y;
	for (int i = 0; i < m; i++) {
		cin >> temp_x >> temp_y;
		condition[temp_x - 1][temp_y - 1] = 1;
	}
	cout << count(0, 0) << endl;
	return 0;
}

也可以改成这样:

#include
using namespace std;
int n, m;
int condition[1001][1001]{};
int dp[1001][1001];
bool w[1001][1001]{};
int count(int i, int j) {
	if (w[i][j]) {
		return dp[i][j];
	}
	else if (i == n - 1 && j == n - 1) {
		return 1;
	}
	else if (condition[i][j] == 1) {
		return 0;
	}
	else if (i == n || j == n) {
		return 0;
	}
	else {
		dp[i][j] = (count(i + 1, j) + count(i, j + 1)) % 100003;
		w[i][j] = 1;
		return dp[i][j];
	}
}
int main() {
	cin >> n >> m;
	int temp_x, temp_y;
	for (int i = 0; i < m; i++) {
		cin >> temp_x >> temp_y;
		condition[temp_x - 1][temp_y - 1] = 1;
	}
	cout << count(0, 0) << endl;
	return 0;
}

可以自己想想他为什么没满分

你可能感兴趣的:(算法,c++,动态规划)