題意:在一維座標系下,給定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也是合法的序列 例如 下面的都是合法的括號序列 下面的都是非法的括號序列 給定乙個由 和 組成的序列,找出以該序列為子串行的最短合法序列。解題思路 這題...