Long Path(思维+基础DP)
题面
题目大意
有n间房子,每个房子有2个门,每到一个房间i就做一个标记,若房间有奇数个标记,就从第一个门出去,前往第pi个房间(1 <= pi <= i),若为偶数个标记,就前往第 i+1个房间。从第1个房间开始(此时第一个房间有1个标记),求到第n+1个房间需要经过几个门。
题目分析
参考博客
代码
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<stack>
#define mod 1000000007
#define esp 1e-9
using namespace std;
int p[1005];
long long dp[1005];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
}
for(int i=2;i<=n+1;i++)
{
dp[i]=dp[i-1]+1+dp[i-1]-dp[ p[i-1] ]+1;//前一个+1表示第一次到达i-1,去到第pi个房间经过一个门,后一个+1第二次到i-1去i经过一个门
dp[i]=dp[i]+mod;//取模时注意取模后的运算可能有负数出现
dp[i]=dp[i]%mod;
}
printf("%lld",dp[n+1]);
return 0;
}