H - Traveling on the Axis ZOJ - 4054 (简单DP)

题目链接:

H - Traveling on the Axis

 ZOJ - 4054 

题目大意::走红绿灯,红绿灯每秒变一次,问走到最后要多少秒。求的是从任一点走到最后的和。

具体思路:倒着判断,

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 }

 

posted @ 2019-05-10 16:29  Let_Life_Stop  阅读(233)  评论(0编辑  收藏  举报