atcoder ABC303 D - Shift vs. CapsLock の勉強
・やり方:
基本的には上の記事を参考。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]))