题解 P1806 【跑步】
issue_is_fw · · 题解
题解太少啦只有俩篇,所以虽然不是什么创新解法也让我通过把 (●'◡'●)
一、设计状态 状态转移嘛,每次只能跑得更多,所以上一次跑了几圈肯定是一个状态。然后要跑完n圈,所以一共跑了几圈也算一个状态,不然我们怎么知道跑完了没呢??
定义
二、状态转移
转移方程:
那么显然,当跑了i圈且这次跑j圈,上一次肯定跑q圈,q<j
初始化很显然,当总共跑i圈时这次跑i圈的方案是一种
for(int i=1;i<=n;i++) dp[i][i]=1;
三重循环:
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
for(int q=1;q<j;q++)
dp[i][j]+=dp[i-j][q];
最后,由于题目要求不能1次跑完,所以不统计
分割线
我们换一种思路.总共要跑n圈,每次可以跑1圈,2圈,....n圈,直到凑出n为止。那是不是相当于有n个物品,物品的重量为1到n,同时价值也是1到n,选那些物品能凑出n呢??这是一个简单的背包问题了。
值得一提的是,这是n^2的做法。