AcWing 2879. 画中漂流
原题链接
中等
作者:
术
,
2021-03-31 14:03:54
,
所有人可见
,
阅读 346
1. dfs做法,会超时,通过两组数据
#include <iostream>
using namespace std;
int d,t,m;
long long res;
const int mod=1e9+7;
void dfs(int u,int k,int len)//u是花了多少力气,k是花了多少时间
{
if(k==t&&u==m){//必须hua完力气
res++;
return;
}
if(u<m){//u小于m才可以花力气
dfs(u+1,k+1,len+1);
}
if(len>1)//len大于1,才可以不花力气
dfs(u,k+1,len-1);
}
int main()
{
cin>>d>>t>>m;
dfs(0,0,d);
if(d+m*2<t)
{
cout<<"0";
}
else
cout<<res%mod;
//cout << "Hello world!" << endl;
return 0;
}
2. dp,dp[i][j]表示花费时间i,花费体力j的方案数;
转移方程 dp[i][j]=dp[i-1][j]+dp[i-1][j-1]//即第i秒用体力和不用体力的方案数 相加
#include <iostream>
using namespace std;
int d,t,m;
const int N=3005;
const int mod=1e9+7;
long long dp[N][N];
int main()
{
cin>>d>>t>>m;
dp[0][0]=1;
for(int i=1; i<=t; i++)
{
for(int j=0; j<=m; j++) //花费体力j
{
int length=d+j-(i-j);
if(length<=0)
continue; //判断是否可到达此状态, 核心!! 若前i秒使用j体力会死, 不管在哪个时间划j次,都会死,则不可到达,即方案数为0
//这样只需
if(j!=0)
dp[i][j]=(dp[i-1][j]+dp[i-1][j-1])%mod;//前i秒花费j体力的前提下, 第i秒 划+不划
else
dp[i][j]=(dp[i-1][j])%mod;//
}
}
cout<<dp[t][m];
//cout << "Hello world!" << endl;
return 0;
}