题解又双叒叕来了!
这是一道简单的DP题,然而作为蒟蒻的我依旧作了许多遍。QwQ
思路
这道题目其实也不是一道难题,只是说放假加上nhoi后都没有写程序了,所以练练手。竟然在一道简单的dp题上卡了那么久,真是内心苦涩啊!劝告各位oier们,不要让编程的手停下来!
这道题目一看就很像用bfs。所以一开始我也傻傻的用了搜索。 后来看到了提示才如梦初醒吖!对于这种路径条数多,而格子数却不算特别多的题目,用搜索应该会超时,所以就只能选择了DP。这也是一道非常简单的DP题。
这道题目一看就很像用bfs。所以一开始我也傻傻的用了搜索。 后来看到了提示才如梦初醒吖!对于这种路径条数多,而格子数却不算特别多的题目,用搜索应该会超时,所以就只能选择了DP。这也是一道非常简单的DP题。
首先!最重要的!不要告诉你们不知道马是怎么走的!
这道题目首先,很容易就能推出公式。
f[i][j]=f[i-1][j]+f[i][j-1]
因为题目也已经说明了,只能往下走和往右走。所以这一个格子的方案数一定是来自于上面的格子和左面的格子。这是显而易见的。
那么知道了这个公式之后,所有都很好办了。
本题有个较为坑爹的地方:
马可以在起点
所以需要特判,在代码环节会提到
每天一个小题解,你学废了吗?
学废了请扣一,没学废请扣眼珠子。
上代码
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define ull unsigned long long using namespace std; const int fx[]={0,-2,-1,1,2,2,1,-1,-2}; const int fy[]={0,1,2,2,1,-1,-2,-2,-1}; int bx,by,mx,my; ull ans; ull f[30][30]; bool s[30][30]; int main(){ scanf("%d%d%d%d",&bx,&by,&mx,&my); ++bx; ++by; ++mx; ++my; f[1][1]=1; s[mx][my]=1; for(int i=1;i<=8;i++) s[ mx + fx[i] ][ my + fy[i] ]=1; for(int i=1;i<=bx;i++){ for(int j=1;j<=by;j++){ if(s[i][j])continue; f[i][j]=max( f[i][j] , f[i-1][j] + f[i][j-1] ); } } printf("%llu ",f[bx][by]); return 0; }//完美收工