今天主要是看的区间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));