節能(區間DP)

2021-08-06 05:56:25 字數 1615 閱讀 5441

描述:

dr.kong設計的機械人卡多越來越聰明。最近市政公司交給卡多一項任務,每天早晨5:00開始,它負責關掉zk大道右側上所有的路燈。

卡多每到早晨5:00準會在zk大道上某盞路燈的旁邊,然後他開始關燈。每盞燈都有一定的功率,機械人卡多有著自覺的節能意識,它希望在關燈期間,zk大道右側上所有路燈的耗電量總數是最少的。

機械人卡多以1m/s的速度行走。假設關燈動作不需要花費額外的時間,因為當它通過某盞路燈時就順手將燈關掉。

請你編寫程式,計算在給定路燈設定,燈泡功率以及機械人卡多的起始位置的情況下,卡多關燈期間,zk大道上所有燈耗費的最小能量。

輸入:

第一行:n表示zk大道右側路燈的數量          (2≤ n ≤ 1000) 

第二行:v表示機械人卡多開始關燈的路燈號碼。   (1≤v≤n)

接下來的n行中,每行包含兩個用空格隔開的整數d和w,用來描述每盞燈的引數

d表示該路燈與zk大道起點的距離  (用公尺為單位來表示),

w表示燈泡的功率,即每秒該燈泡所消耗的能量數。路燈是按順序給定的。

( 0≤d≤1000, 0≤w≤1000 )

輸出:

輸出乙個整數,即消耗能量之和的最小值。注意結果小於200,000,000

樣例輸入:4 3

2 25 8

6 18 7

樣例輸出:56

#include#include#includeusing namespace std;

int dp[1005][1005][2]; //dp[i][j][0]表示由區間i,j之間最後達到i位置時的耗電量 ,dp[i][j][1]表示由區間i,j之間最後達到j位置時的耗電量

int asd[1005][1005],num,pos,totle=0;; //asd[i][j]陣列表示從i位置到j位置初始狀態下的功率總耗

struct asd

gw[1005];

void sove()

for(int i=pos+1;i<=num;i++) //同理這是第二種情況

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

}int main()

memset(dp,0,sizeof(dp));

memset(asd,0,sizeof(asd)); //初始化兩個陣列

for(int i=1;i<=num;++i) //計算從i位置到j位置初始狀態下的功率總耗

}sove();

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

return 0;

}

線性dp 區間dp

1 尼克的任務 額一道挺水的題,愣是做了幾個小時 動態規劃大致的思路還是找乙個轉移 換個詞就是影響 我們可以明顯看出本題的規則 空暇時,一遇到任務必須挑乙個接 求1 n時間內最大空暇時間 所以將任務排序是必要的,兩個關鍵字 再來想象一下當我做到第i 個任務時,我在 st i st i t i 1 時...

線狀DP及區間DP

這裡我們都用到動態規劃的思想 dynamic programming,簡稱dp。本質就是組合子問題來求解原問題,且對每個子問題只求解一次。一般來說四個步驟 1.刻畫乙個最優結構特徵 2.遞迴的定義最優解值 3.計算最優解的值 4.利用計算出的資訊構造乙個最優解 這邊直接給出 include incl...

區間dp小結

區間dp,顧名思義,就是在區間上dp,即把整個區間劃分為乙個個的小區間,在小區間內dp求出最優值,然後把這些小區間合併以後就是整個取件的最優值。下面是一些比較經典的區間dp題目 1.nyoj 737 石子合併 題意 有n堆石子,每堆有a i 個,每次合併時只能合併相鄰的兩堆,代價為兩堆石子的個數之和...