POJ 3042 區間dp 左端點右端點01

2021-08-27 00:14:01 字數 1265 閱讀 9713

題意:在一維座標系下,給定n個草坪的座標(1<=n<=1000),再給定起點l(1<=l<=1e6)。每個草坪有乙個staleness值,初始化為0。每次走一格,所有的staleness值+1,並且要從起點遍歷每乙個草坪,求staleness值的最小值。

離散化處理n個點

dp[i][j][0]:區間[i, j]已經遍歷完,目前在i點時,staleness的最小值。

dp[i][j][1]:區間[i, j]已經遍歷完,目前在j點時,staleness的最小值。

在更新dp[i][j][0/1]的過程中,有n-(j-i)個點的staleness在變化

dp[i][j][0]:

(1)從[i+1, j]的左端點到i:dp[i+1][j][0]+(n-(j-i))*(a[i+1]-a[i]);

(2)從[i+1, j]的右端點到i:dp[i+1][j][1]+(n-(j-i))*(a[j]-a[i]);

dp[i][j][1]:

(1)從[i, j-1]的左端點到j:dp[i][j-1][0]+(n-(j-i))*(a[j]-a[i]));

(2)從[i, j-1]的右端點到j:dp[i][j-1][1]+(n-(j-i))*(a[j]-a[j-1]));

#include 

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f;

const

int n = 1010;

int a[n];

int dp[n][n][2];

int n, l;

int bin(int l, int r, int key)

return r+1;

}int main()

if(flag) a[++n] = l;

sort(a+1, a+n+1);

int pos = bin(1, n, l);

memset(dp, inf, sizeof(dp));

dp[pos][pos][0] = dp[pos][pos][1] = 0;

for(int i = pos; i >= 1; --i)

for(int j = pos; j <= n; ++j)

printf("%d\n", min(dp[1][n][0], dp[1][n][1]));

return

0;}

poj 3042 區間dp(草的過期程度最小)

題意 在一維上有n塊草坪,給出每塊草坪的位置 可以看做是x軸上的整數點 bessie初始位於l位置,他可以向左右兩個方向去吃草坪,假設吃草坪的時間不計,路上的時間是每走乙個單位,時間 1,每塊草坪都有乙個staleness值,這個值恰好等於bessie到達的時間,現在要求的是bessie將所有草坪吃...

poj1651 區間DP 基礎

題意 給你一串數字,頭尾不能動,每次取出乙個數字,這個數字貢獻 該數字與左右相鄰數字的乘積,求乙個最小值。思路 用dp s t 去代表s到t的最小值,包括a s 和a t 然後從區間為3開始列舉,對每個小區間列舉乙個取出的數,狀態轉移方程就是 dp s t min dp s k dp k j a i...

poj 1141 區間dp 列印路徑

題意 定義合法的括號序列如下 1 空序列是乙個合法的序列 2 如果s是合法的序列,則 s 和 s 也是合法的序列 3 如果a和b是合法的序列,則ab也是合法的序列 例如 下面的都是合法的括號序列 下面的都是非法的括號序列 給定乙個由 和 組成的序列,找出以該序列為子串行的最短合法序列。解題思路 這題...