停不下来的团长奥尔加 题解

众所周知,OIer每天都在考试,而考试十分消耗rp。近期,一位Orzer竟然在考试的时候突然开始笑,一直停不下来,这究竟是怎么一回事呢?快和小编一起来看一看吧

自从看了这个题面,某Orzer看一句笑10分钟,脑子里一直在循环播放卡其脱离太和希望之花,根本停不下来,最后竟然活活笑死,直接爆零!网友直呼这道题兼职难到爆!
今天,我们又学习了一种新的题目,这种题目的难点不在转化,不在构造,竟然就在题面本身!水平较低的OIer竟然竭尽全力都无法看完题面!古人云,大象无形,大音希声,原来这道题已经达到了这种境界!小编要说,出题人,真有你的!

(以上都是小编写的)

前言:

这题。。。我竟然没看出来是dp,Wtcl。
明明扫一遍就完事的题。。。。我还非要打了个表,还找了一个看起来特别对的规律,试了好几组都没问题,然后最后它挂了?
唉,Wtcl。

解析:

显然可以dp。。甚至放到之前的最初级的线性dp的题单里也不为过。。。
令dp[i]表示奇数次从1走到i的步数。那么dp[i]=dp[i-1]*2-dp[a[i-1]]+2;
代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000000+10,mod=1e9+7;
int a[maxn];
int n;
ll dp[maxn];
void Solve(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	for(int i=2;i<=n+1;++i) dp[i]=(2*dp[i-1]-dp[a[i-1]]+mod+2)%mod;
	printf("%lld
",dp[n+1]);
}
int main(){
	//freopen("rideon.in","r",stdin);
	//freopen("rideon.out","w",stdout);
	Solve();
	return 0;
}


原文地址:https://www.cnblogs.com/wwcdcpyscc/p/13892761.html