一开始直接 dfs 竟然会TLE,思考一会后简单动态规划搞定QAQ
思路:假如当前行列都不为偶数的话,即当前方案数等于上边和左边方案数之合
#include<iostream>
using namespace std;
int n,m;
int dp[35][35];
int main()
{
cin>>n>>m;
dp[1][1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(i%2!=0||j%2!=0)
dp[i][j]+=dp[i-1][j]+dp[i][j-1];
cout<<dp[n][m];
}
再来个TLE dfs 版本吧,也能水分数呜呜呜
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int st[32][32],dx[2]={0,1},dy[2]={1,0};
bool book[32][32];
int n,m,ans,ss;
void dfs(int x,int y)
{
if(x>n||y>m)return;
if(x==n&&y==m)ans++;
for(int i=0;i<2;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(book[xx][yy]||(xx%2==0&&yy%2==0))continue;
if(xx<1||yy<1||xx>n||yy>m)continue;
book[xx][yy]=true;
dfs(xx,yy);
book[xx][yy]=false;
}
}
int main()
{
cin>>n>>m;
dfs(1,1);
cout<<ans;
return 0;
}
这道题dfs复杂度是多少呢
指数
为什么单独设定dp[1][1]=1啊?
请问大佬,为什么要写成f[i][j]+=f[i-1][j]+f[i][j-1];而不是f[i][j]=f[i-1][j]+f[i][j-1];呢
我也想知道为什么 麻烦你知道答案了和我说一声
这样写你应该就能看懂了
这个能过吗?
请问兄弟他的代码你理解吗,我还是不理解
能过,我的是java的,你c++对应改下跟我一样的逻辑就行
因为刚开始循坏到i=1,j=1的时候如果不这样写 a[1][1]就会变成0,刚开始矩阵默认为0,加上0不受影响,或者你可以在循环里面加判断语句 if(i==1 && j==1 ) continue;
非常感谢,看懂了
大佬你好,请问为什么“假如当前行列都不为偶数” 而代码里面“if(i%2!=0||j%2!=0)”用的是||不是&&?
都不是偶数才行 有一个是偶数满足题意
噢噢我明白了,谢谢!
dp[i]为什么要+=啊
有的dp[i]初始值不是0,需要加原来的
void dfs(int x,int y)
{
if(x==n&&y==m)
{
count++;
sum=count;
return;
}
}
请问我这个函数哪里写错了… 我去掉了判断奇偶数的条件 但是输出一下遍历的位置 只有一条路径
大佬我想问一下
dp[i][j]+=dp[i-1][j]+dp[i][j-1];这个怎么理解啊
当前状态只能是从上边或者左边来,那么当前总方案数就是这两状态之和
谢谢!
那为什么要+=呢?
强!!!