ZJ1. 附加题
描述
存在n+1个房间,每个房间依次为房间1 2 3...i,每个房间都存在一个传送门,i房间的传送门可以把人传送到房间pi(1<=pi<=i),现在路人甲从房间1开始出发(当前房间1即第一次访问),每次移动他有两种移动策略:输入描述
第一行包括一个数字n(30%数据1<=n<=100,100%数据 1<=n<=1000),表示房间的数量,接下来一行存在n个数字 pi(1<=pi<=i), pi表示从房间i可以传送到房间pi。输出描述
输出一行数字,表示最终移动的次数,最终结果需要对1000000007 (10e9 + 7) 取模。示例1
输入:
2 1 2
输出:
4
说明:
开始从房间1 只访问一次所以只能跳到p1即 房间1, 之后采用策略A跳到房间2,房间2这时访问了一次因此采用策略B跳到房间2,之后采用策略A跳到房间3,因此到达房间3需要 4 步操作。C 解法, 执行用时: 1ms, 内存消耗: 308KB, 提交时间: 2021-09-12
#include<stdio.h> int step(int*a,int n){ int dp[n+1]; memset(dp,0,sizeof(dp)); int mod=1e9+7; for(int i=1;i<=n;i++){ dp[i]=(2*dp[i-1]%mod-dp[a[i-1]-1]+2)%mod; } return dp[n]; } int main(){ int n; scanf("%d",&n); int a[n]; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } int s=step(a,n); printf("%d",s); return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2020-08-16
#include <stdio.h> int step(int *a, int n) { int dp[n + 1]; memset(dp, 0, sizeof(dp)); int mod = 1e9 + 7; for(int i = 1; i <= n; i++) { dp[i] = (2 * dp[i - 1] % mod - dp[a[i - 1] - 1] + 2)%mod; } return dp[n]; } int main() { int n; scanf("%d", &n); int a[n]; for(int i = 0 ; i < n; i++) { scanf("%d", &a[i]); } int s = step(a, n); printf("%d",s); return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 416KB, 提交时间: 2020-08-08
#include <stdio.h> int step(int *a, int n) { int dp[n + 1]; memset(dp, 0, sizeof(dp)); int mod = 1e9 + 7; for(int i = 1; i <= n; i++) { dp[i] = (2 * dp[i - 1] % mod - dp[a[i - 1] - 1] + 2)%mod; } return dp[n]; } int main() { int n; scanf("%d", &n); int a[n]; for(int i = 0 ; i < n; i++) { scanf("%d", &a[i]); } int s = step(a, n); printf("%d",s); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 300KB, 提交时间: 2022-03-04
#include<stdio.h> long long p[1001],dp[1001],n; const long long mod=1000000007; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&p[i]); } for(int i=2;i<=n+1;i++) dp[i]=(2 * dp[i-1] - dp[p[i-1]] + 2) % mod; if(dp[n+1]<0) printf("%d",dp[n+1]+mod); else printf("%d",dp[n+1]); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 304KB, 提交时间: 2021-09-16
#include<stdio.h> long long int mod = 1e9+7; int main(){ long long int n; scanf("%lld", &n); int pi[n+1]; for(int i = 1; i <= n; ++i){ scanf("%d", &pi[i]); } // int accessCount[n+1]; // for(int i = 1; i <= n; ++i){ // accessCount[i] = 0; // } // long long int count = 0; // for(int i = 1; i <= n;){ // accessCount[i] += 1; // count = count + 1; // if(accessCount[i] % 2 > 0){ // i = pi[i]; // }else{ // ++i; // } // } // printf("%lld\n", count); long long int dp[n+1]; for(int i = 0; i <= n + 1; ++i){ dp[i] = 0; } for(int i = 2; i <= n + 1; ++i){ dp[i] = (2 * dp[i - 1] - dp[pi[i - 1]] + 2) % mod; } printf("%lld\n", dp[n+1] > 0 ? dp[n + 1] : dp[n + 1] + mod); return 0; }