zoj3541 區間dp求方案

2021-08-24 18:17:11 字數 1120 閱讀 4507

題目鏈結

先吐槽一下hdu的spj,死都過不了,uva和zoj上都能過。。。

題意就是一排上有很多燈,給你每個燈按下去後能亮的時間和座標(人每秒走一格)

首先發現列舉起點做不了,所以要列舉終點。

這裡有乙個很有用的結論,就是每個燈我只關心最後一次路過的時間,而從某個點一直按到結束的合法方案中,我們要麼直接走到終點順路把按鈕按了,要麼走到還沒按的中間這段的另一頭按完後在往中間走。這樣想還是不好做,所以就倒著來,從一段區間往左或右走,盡量保證時間最少,因為這樣就能使後面有更多的時間去按左右的按鈕。(從這個角度貪心,起點肯定在左端點或右端點,而且事實上能從中間出發的情況也可以從兩頭出發)

dp[i][j][k]表示把i到j按完且到結束按鈕都不會彈起的方案最短用時,k==0表示在i,1表示在j。轉移時儲存從上乙個狀態的左還是右轉移過來,就可以輸出方案了

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf=0x3f3f3f3f;

int n;

int t[205],x[205];

int dp[205][205][2],pre[205][205][2];

int main()

else

if(vl>vr&&vr0]=vr;

pre[i][j][0]=1;

}else

vl=dp[i][j-1][0]+x[j]-x[i];

vr=dp[i][j-1][1]+x[j]-x[j-1];

if(vl<=vr&&t[j]>vl)

else

if(vl>vr&&t[j]>vr)

else}}

int pos,l,r;

if(dp[1][n][0]!=inf)

else

if(dp[1][n][1]!=inf)

else

while(l<=r)

else

}printf("\n");

} return

0;}

zoj 3537 區間dp 計算幾何

題意 給定n個點的座標,先問這些點是否能組成乙個凸包,如果是凸包,問用不相交的線來切這個凸包使得凸包只由三角形組成,根據costi,j xi xj yi yj p算切線的費用,問最少的切割費用。題解 點我 2015 07 20 專題複習 稍微修改了一下,順便發現題號寫錯了 1 include2 in...

zoj1276 區間dp 路徑輸出

題意 矩陣連乘,找到最小次數,同時輸出括號的巢狀方式 分析 經典的區間dp,並且記錄下了dp的path 因為是遞迴得到的path,所以遞迴壓棧按從裡到外的順序得到path就可以了 輸出巢狀括號部分很好的考察了對棧的理解,和遞迴執行的順序。注意題目輸出中有的地方有空格。1 zoj1276 路徑輸出用到...

合併遊戲 737 區間Dp

石子合併 一 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。輸入 有多組測試資...