有N<3000只宠物要喂,每次只能喂一只,每喂一只宠物,宠物的满足度取决于:
1 紧靠的两个邻居都没喂,a[i]
2 邻居中有一个喂过了,b[i]
3 两个邻居都喂过了,c[i]
把所有宠物喂一遍,得到的满足度之和最大为多少。
===========
动态规划,
动态转移方程的难点 在于 搞清楚“无后效性”
===========
dp[i]为从i开始往后喂
以第一只宠物为例,可以选择
1) 先喂第一只, a[1] + 第二只排在第一只后面的最大值。注意,先喂第一只,只会影响第二只。
2)先喂第二只,再喂第一只,b[1]+第二只排在第一只前的最大值。这时候的问题被分解成了(有 2.3.4.5....N号宠物,共N-1个。)的子问题。
用dp[i]表示第i只宠物
dp[i][0] 表示 后喂左边的宠物(第i-1只)
dp[i][1] 表示 先喂左边的宠物(第i-1只)
dp[i][0]=max(a[i]+dp[i+1][1], b[i]+dp[i+1][0])
dp[i][1]=max(b[i]+dp[i+1][1], c[i]+dp[i+1][0])
i从n到1,答案是dp[1][0]
=========实际测试的时候…………
没有设置初始dp[n][0]与dp[n][1]就会得到WA,
数据
2
3 5
9 8
4 0
没有初始化的时候会得到 dp[1][0] = 17 = b[1] + b[2]…… 没人想第一个吃,都想做第二个吃饭的.