• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
KのMidGard
人是人的一场雨,你终将独自前行。
博客园    首页    新随笔    联系   管理    订阅  订阅

[CodeForce]358D Dima and Hares

有N3000只宠物要喂,每次只能喂一只,每喂一只宠物,宠物的满足度取决于:紧靠的邻居都没喂,a[i];邻居中有一个喂过了,b[i];邻居都喂过了,c[i]。把所有宠物喂一遍,得到的满足度之和最大为多少。

有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]…… 没人想第一个吃,都想做第二个吃饭的.

posted @ 2013-10-31 10:26  风行狩  阅读(251)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3