记录一下动态规划初始化要全面这件事,祭奠一下我的猪脑子
看题面感觉是动态规划,仔细看发现前后有状态联系。
所以考虑定义状态 为跑了 圈的所有方案数,找了半天没找出来状态怎么转移,一看每次跑的要比上一圈多,所以改一下定义。
定义 为跑了 圈且上次跑了 圈的所有方案数
易得 ,即只要前一次跑的是小于 的,都可以跑到当前状态来。
//定义f[i][j]为:跑完前i圈,且上次跑的圈数为j的方案数
//f[i][j]=f[i-j][<j]
AC代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,f[501][501],ans;
signed main(){
cin>>n;
for(int i=0;i<=n;++i)
f[i][i]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<j;++k)
if(i-j>=0)f[i][j]+=f[i-j][k];
for(int i=1;i<n;++i)
ans+=f[n][i];
cout<<ans;
return 0;
}
注意,初始化的时候不是 就够了,要把所有都是 的地方全部找出来。
由于是分多次跑完,所以最后答案不能加上