atcoder ABC303 D - Shift vs. CapsLock の勉強

atcoder.jp

・参考:
drken1215.hatenablog.com


・やり方:
基本的には上の記事を参考。jは0でcapslockキーがoff,1でon。dp[i][j]はi文字でのjがON,OFFであったときにかかる時間。
     
capslockの遷移はdp[i][0]=min(dp[i][0],dp[i][1]+Z)、dp[i][1]=min(dp[i][1],dp[i][0]+Z)。

aを入力するにはj=0のときX秒、j=1のときY秒かかるので、dp[i+1][0]=min(dp[i+1][0],dp[i][0]+X),dp[i+1][1]=min(dp[i+1][1],dp[i][1]+Y)

Aを入力するにはj=0のときY秒、j=1のときX秒かかるので、dp[i+1][0]=min(dp[i+1][0],dp[i][0]+Y),dp[i+1][1]=min(dp[i+1][1],dp[i][1]+X)


・具体的にみる:
dp[0][0]=0として、i=0のときをみると

dp[0][1]=min(dp[0][1],dp[0][0]+Z)=min(10**18,Z)=Z。

aを押すとき
dp[1][0]=dp[0+1][0]=min(dp[0+1][0],dp[0][0]+X)=min(10**18,X)=X
dp[1][1]=dp[0+1][1]=min(dp[0+1][1],dp[0][1]+Y)=min(10**18,Z+X)=Z+Y

Aを押すとき
dp[1][0]=dp[0+1][0]=min(dp[0+1][0],dp[0][0]+Y)=min(X,Y)
dp[1][1]=dp[0+1][1]=min(dp[0+1][1],dp[0][1]+X)=min(Z+Y,Z+X)

と遷移していく。

X,Y,Z=map(int,input().split())
S=input()
n=len(S)

dp=[[10**18 for _ in range(2)] for _ in range(n+1)]   #下のforのiは0からn-1まではしる。i+1までリストを作る必要がある。
#print(dp)
dp[0][0]=0

for i in range(n):
  #CapsLock押したとき
  dp[i][0]=min(dp[i][0],dp[i][1]+Z)
  dp[i][1]=min(dp[i][1],dp[i][0]+Z)
  
  #aの入力
  if S[i]=='a':
    dp[i+1][0]=min(dp[i+1][0],dp[i][0]+X)
    dp[i+1][1]=min(dp[i+1][1],dp[i][1]+Y)
  
  #Aの入力
  if S[i]=='A':
    dp[i+1][0]=min(dp[i+1][0],dp[i][0]+Y)
    dp[i+1][1]=min(dp[i+1][1],dp[i][1]+X)

#i=n-1のとき、i+1よりdp[n](Sを1文字、2文字と数えたときのn文字目を打つ時間)がわかる。
print(min(dp[n][0],dp[n][1]))