李白打酒加强版
暴力递归,只能过40%
#include<iostream>
using namespace std;
int L;
int N,M;
int cnt;
int flag;
void dfs(int u)
{
if(N<0||M<0||L<0)
return;
if(L==0&&M!=0)
return;
if(N==0&&M==0&&L==0&&flag==1)
cnt++;
if(M!=0)
{
M--;
L--;
flag=1;
dfs(u+1);
M++;
L++;
}
N--;
L*=2;
flag=0;
dfs(u+1);
N++;
L/=2;
}
int main()
{
L = 2;
cin >> N >> M;
dfs(0);
cout << cnt << endl;
return 0;
}
dp,能过全部数据
#include<iostream>
#include<cstring>
using namespace std;
const int mod = 1e9+7;
int f[105][105][105];
int main()
{
int N,M;
cin >> N >> M;
memset(f,0,sizeof f);
f[0][0][2] = 1;
for(int i=0;i<=N;i++) // i次店
{
for(int j=0;j<=M;j++) // j次花
{
for(int k=0;k<=M+5;k++)
{
int& v = f[i][j][k];
if(i && k%2==0) v = (v+f[i-1][j][k/2])%mod;
if(j) v = (v+f[i][j-1][k+1])%mod;
}
}
}
cout << f[N][M-1][1] << endl;
return 0;
}
分析
就是dp
没做出来原因:
只会暴力,看到题直接写了递归,然后不出意料爆了。然后就脑子空空,灰溜溜地去看题解。
其实看视频时,y总一说dp,我就会了(只是细节又debug了好久,比如状态转移时要看上一步能不能转移下来)。