H - Traveling on the Axis ZOJ - 4054 (简单DP)
题目链接:
H - Traveling on the Axis
题目大意::走红绿灯,红绿灯每秒变一次,问走到最后要多少秒。求的是从任一点走到最后的和。
具体思路:倒着判断,
dp[i][0]代表从当前点开始到达剩余的点的时间总和
dp[i][1]代表从当前点的反状态到达剩余的点的时间总和。
当s[i]=='0'的时候
dp[i][0]=dp[i+1][0]+(n-i+1)*2;
dp[i][1]=dp[i+1][0]+(n-i+1).
当s[i]=='1'的时候,
dp[i][0]=dp[i+1][0]+n-i+1
dp[i][1]=dp[i+1][0]+(n-i+1)*2;
AC代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 # define ll long long
4 const int maxn = 2e5+100;
5 ll dp[maxn][3];
6 char str[maxn];
7 int main()
8 {
9 int T;
10 scanf("%d",&T);
11 while(T--)
12 {
13 scanf("%s",str+1);
14 ll len=strlen(str+1);
15 if(str[len]=='1')
16 dp[len][0]=1,dp[len][1]=2;
17 else
18 dp[len][0]=2,dp[len][1]=1;
19 for(ll i=len-1; i>=1; i--)
20 {
21 if(str[i]=='0')
22 {
23 dp[i][0]=dp[i+1][0]+(len-i+1ll)*2ll;
24 dp[i][1]=dp[i+1][0]+(len-i+1);
25 }
26 else
27 {
28 dp[i][0]=dp[i+1][1]+len-i+1ll;
29 dp[i][1]=dp[i+1][1]+(len-i+1ll)*2ll;
30 }
31 }
32 ll sum=0;
33 for(ll i=1; i<=len; i++)
34 {
35 sum+=(ll)dp[i][0];
36 }
37 printf("%lld\n",sum);
38 }
39 return 0;
40 }