训练日记

今天主要是看的区间dp,在这一种题型中比较经常出现的是回文数的问题里面有一个求不连续回文数的长度的题

(1)hdu-4745-Two Rabbits

两只6兔子,在n块围成一个环形的石头上跳跃,每块石头有一个权值ai,一只从左往右跳,一只从右往左跳,每跳一次,两只兔子所在的石头的权值都要相等,在一圈内(各自不能超过各自的起点,也不能再次回到起点)它们最多能经过多少个石头(1 <= n <= 1000, 1 <= ai <= 1000)。

其实就是求一个环中,非连续最长回文子序列的长度。

两个方法,一个是环倍增成链,就是让a[n+i]=a[i];中间就是当成链来求回文数的长度,

ans = max(ans, dp[i][i + n - 1]);

ans = max(ans, dp[i][i + n - 2] + 1);//特殊的情况:1 2 4 2它的环状回文数的长度是4

另一个方法是把链切成两半,两个回文数的和就是要求的环状回文数的长度

ans = max(ans, dp[1][i] + dp[i + 1][n]);//特殊i存在等于n的情况,就相当于不切

除了这种类型的还有别的类型的

(2)zoj-3469- Food Delivery

有一家快餐店送外卖,现在同时有n个家庭打进电话订购,送货员得以1/V的速度一家一家的运送,但是每一个家庭都有一个不开心的值,每分钟都会增加一倍,值达到一定程度,该家庭将不会再订购外卖了,现在为了以后有更多的家庭订购,要将外卖送到的情况下使得所有用户的不开心值总和达到最小。很明显,每多走一分钟,没送到的家庭的不开心值都会加倍。

在派送过程中会存在方向问题

dp[i][j][0]表示从i到j用户都送到最小不开心值,最终停留的位置是i

dp[i][j][1]表示从i到j用户都送到最小不开心值,最终停留的位置是j

    状态有四种,

    dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(a[i+1].x-a[i].x)*(delay+a[i].v));

    dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(a[j].x-a[i].x)*(delay+a[i].v));

    dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(a[j].x-a[i].x)*(delay+a[j].v));

    dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(a[j].x-a[j-1].x)*(delay+a[j].v));



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值