弱鸡求助

P1002 [NOIP2002 普及组] 过河卒

~~我能来暖楼吗???~~
by Baiwhiter @ 2019-04-23 13:44:27


~~long long a[m+1][n+1]={};~~ ???
by Baiwhiter @ 2019-04-23 13:46:21


# 建议开一个dp数组
by Baiwhiter @ 2019-04-23 13:55:50


@[梦曦酱](/space/show?uid=198718) 楼主在不在
by Strong_Jelly @ 2019-04-23 14:15:50


原本的思路是将数组全初始化为1 再将马可跳的数变为0 靠a[m][n]=a[m][n-1]+a[m-1][n]计算 递推到a[m][n]出结果
by 梦曦酱 @ 2019-04-24 12:56:09


现在的代码如下```cpp #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { int m,n; int oi=op=0; scanf("%d%d",&m,&n); long long a[m+1][n+1]={}; for(op=0;op<=n;op++) { for(oi=0;oi<=m;oi++) { a[oi][op]=1; } } int o,p; scanf("%d%d",&o,&p); a[o][p]=0; if(o-1>=0&&p-2>=0)a[o-1][p-2]=0; if(o+1<=n&&p-2>=0)a[o+1][p-2]=0; if(o-2>=0&&p-1>=0)a[o-2][p-1]=0; if(o+2<=n&&p-1>=0)a[o+2][p-1]=0; if(o-2>=0&&p+1<=m)a[o-2][p+1]=0; if(o+2<=n&&p+1<=m)a[o+2][p+1]=0; if(o-1>=0&&p+2<=m)a[o-1][p+2]=0; if(o+1<=n&&p+2<=m)a[o+1][p+2]=0; a[2][1]=a[1][2]=1; for(op=1;op<=n;op++) { if(a[1][op-1]=0) a[1][op]=0; } for(oi=1;oi<=m;oi++) { if(a[oi-1][1]=0) a[oi][1]=0; } for(op=2;op<=n;op++) { for(oi=2;oi<=m;oi++) { if(a[oi][op]==0) a[oi][op]=0; else a[oi][op]=a[oi-1][op]+a[oi][op-1]; } } printf("%d",a[m][n]); return 0; } ```
by 梦曦酱 @ 2019-04-24 12:57:38


AC一个点 2333 ```c #include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[25][25]; int dp[25][25]; int main() { int m,n; memset(dp,0,sizeof(dp));//清空dp数组 memset(a,1,sizeof(a));//地图初始化 int oi,op; int o,p; scanf("%d %d %d %d",&m,&n,&o,&p); //for(op=1;op<=n;op++) //{ // for(oi=1;oi<=m;oi++) // { // a[oi][op]=1; // } //} a[o][p]=0; if(o-1>=0&&p-2>=0)a[o-1][p-2]=0; if(o+1<=n&&p-2>=0)a[o+1][p-2]=0; if(o-2>=0&&p-1>=0)a[o-2][p-1]=0; if(o+2<=n&&p-1>=0)a[o+2][p-1]=0; if(o-2>=0&&p+1<=m)a[o-2][p+1]=0; if(o+2<=n&&p+1<=m)a[o+2][p+1]=0; if(o-1>=0&&p+2<=m)a[o-1][p+2]=0; if(o+1<=n&&p+2<=m)a[o+1][p+2]=0;//马占领 //a[2][1]=a[1][2]=1; //for(op=1;op<=n;op++) //{ // if(a[1][op-1]=0) a[1][op]=0; //} //for(oi=1;oi<=m;oi++) //{ // if(a[oi-1][1]=0) a[oi][1]=0; //}多余了 dp[1][0]=1;//第一步 for(op=1;op<=n+1;++op) { for(oi=1;oi<=m+1;++oi) { dp[op][oi]=dp[op-1][oi]+dp[op][oi-1];//dp if(a[oi-1][op-1]==0) dp[op][oi]=0;//马控制的点不算步 } } printf("%d",dp[m+1][n+1]);//右下挪一下 return 0; } ```
by Baiwhiter @ 2019-04-24 13:52:52


|