题目:
落谷的P1002题:https://www.luogu.com.cn/problem/P1002
思路:
最开始我用的是深搜算法,但是提交后发现超时了,改用的DP。
到达某一个位置所需要的方法为:DP[i][j] = DP[i-1][j] + DP[i][j-1]
这个公式不需要推,大家自己验证一下就可以啦!
当然还是有点细节要处理,就是DP[i][j]不可以是马的位置以及马控制点的位置
当然 DP[i-1][j]和DP[i][j-1]也是一样不可以
上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<list>
#include<string>
using namespace std;
#define ll long long
ll a[23][23] = {0};///一定要用ll,不然可能会超时哦
int a1,b1,a2,b2;
int main()
{
cin>>a1>>b1>>a2>>b2;
a[0][0] = 1;
a[a2][b2] = -33;
a[a2+2][b2+1] = -33;
a[a2+1][b2+2] = -33;
a[a2-1][b2+2] = -33;
a[a2-2][b2+1] = -33;
a[a2-2][b2-1] = -33;
a[a2-1][b2-2] = -33;
a[a2+1][b2-2] = -33;
a[a2+2][b2-1] = -33;
for(int i=0; i<=a1; i++)
{
for(int j=0; j<=b1; j++)
{
if(a[i][j]!=-33)
{
if(i && a[i-1][j]!=-33)
a[i][j] += a[i-1][j];
if(j && a[i][j-1]!=-33)
a[i][j] += a[i][j-1];
}
}
}
cout<<a[a1][b1];
}