题解 P1806 【跑步】
首先,让我们分析一下题意,提炼后如下:
1.次数 > 1;
2.V后一秒 > V前一秒;
3.跑n圈。
理清了思路,还有一个问题,用什么方法做这题?
1.DFS(深搜),炸时间,取消;
2.BFS(广搜),依旧炸时间,取消;
3.暴力,当然更不行;
于是,经过了漫长的思考, 我们决定——
出来吧,皮卡丘 DP动规!
什么是动规?
动规,全称动态规划
指动态地演变每一步,类似著名的斐波那契数列:
末路等于来路之和……
实现过程即为开一个足够的数组,然后模拟每一步,最终答案为数组的第n项。
时间复杂度:低
话不多说,上AC代码!
#include<bits/stdc++.h>//棒棒哒头文件
using namespace std;
long long n,ans[501]; //分别为总圈数n以及动规数组,动规数组的第i个下标表示前i圈的方案总数
int main(){
scanf("%d",&n);//输入
ans[0]=1;//第0项暂时设为1,保证数据来源(相当于借的)
for (int i=1;i<=n;i++){//模拟前i圈
for (int j=n;j>=i;j--){//模拟前i圈中每一圈的演变过程
ans[j]+=ans[j-i];//第i圈是由它的前i圈(1~i)演变而来
}
}
//DP结束
cout<<ans[n]-1<<endl;//完美输出
return 0;//习惯性 好习惯撒花
}