大盗阿福
状态机其实就是把不好表示的状态分类表示出来,从而达到每一个i都可以从i-1的某个状态继承而来
q=int(input())
for _ in range(q):
n=int(input())
a=[0]+list(map(int,input().split()))
dp=[[0,0]for i in range(n+1)]
for i in range(1,n+1):
dp[i][0]=max(dp[i-1][0],dp[i-1][1])
dp[i][1]=dp[i-1][0]+a[i]
print(max(dp[-1]))
股票买卖IV
这一题dp数组的初始化很搞,如果考虑不周全就会出bug
n,k=map(int,input().split())
k*=2
a=[0]+list(map(int,input().split()))
dp=[[[0,0]for i in range(k+1)]for j in range(n+1)]
#dp[i][j][k]表示在第i天完成第j笔交易
#k=0代表手上无股票,k=1代表手上有股票
for i in range(k+1):
dp[0][i][1]=-1<<31
for i in range(n):
dp[i][0][1]=-1<<31
for i in range(1,n+1):
for j in range(1,k+1):
# if i==2:
# print(dp[i][j][0])
dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j-1][1]+a[i])
# if i==2:
# print(i-1,j-1,dp[i-1][j-1][1])
# print(dp[i][j][0],"----------------")
dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][0]-a[i])
# for i in dp:
# print(i)
print(max(dp[-1][-1]))
股票买卖V
分析清楚状态的种类,一步步继承而来,只需要初始化合法的位置即可
n=int(input())
a=[0]+list(map(int,input().split()))
dp=[[[-1<<31 for i in range(2)]for j in range(2)]for k in range(n+1)]
#0 0 代表不无股票且不处于冷冻期
#0 1 代表无股票且处于冷冻期
#1 0 代表有股票且不处于冷冻期
#1 1 代表有股票且有冷冻期
dp[0][0][0]=0
for i in range(1,n+1):
dp[i][0][0]=max(dp[i-1][0][0],dp[i-1][0][1])
dp[i][0][1]=dp[i-1][1][0]+a[i]
dp[i][1][0]=max(dp[i-1][1][0],dp[i-1][0][0]-a[i])
print(max(dp[-1][0]))