题目链接:
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 }