1. 程式人生 > >區間DP code[vs]1258 關路燈

區間DP code[vs]1258 關路燈

兩個 輸出 sample flask cst ostream 所有 %d 整數

1258 關路燈

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 大師 Master
題目描述 Description

多瑞卡得到了一份有趣而高薪的工作。每天早晨他必須關掉他所在村莊的街燈。所有的街燈都被設置在一條直路的同一側。

多瑞卡每晚到早晨5點鐘都在晚會上,然後他開始關燈。開始時,他站在某一盞路燈的旁邊。

每盞燈都有一個給定功率的電燈泡,因為多端卡有著自覺的節能意識,他希望在耗能總數最少的情況下將所有的燈關掉。

多端卡因為太累了,所以只能以1m/s的速度行走。關燈不需要花費額外的時間,因為當他通過時就能將燈關掉。

編寫程序,計算在給定路燈設置,燈泡功率以及多端卡的起始位置的情況下關掉所有的燈需耗費的最小能量。

輸入描述 Input Description

輸入文件的第一行包含一個整數N,2≤N≤1000,表示該村莊路燈的數量。

第二行包含一個整數V,1≤V≤N,表示多瑞卡開始關燈的路燈號碼。

接下來的N行中,每行包含兩個用空格隔開的整數D和W,用來描述每盞燈的參數,其中0≤D≤1000,0≤W≤1000。D表示該路燈與村莊開始處的距離(用米為單位來表示),W表示燈泡的功率,即在每秒種該燈泡所消耗的能量數。路燈是按順序給定的。

輸出描述 Output Description

輸出文件的第一行即唯一的一行應包含一個整數,即消耗能量之和的最小值。註意結果小超過1,000,000,000。

樣例輸入 Sample Input

4

3

2 2

5 8

6 1

8 7

樣例輸出 Sample Output

56

數據範圍及提示 Data Size & Hint

貼代碼

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,v;
 7 int in;
 8 int d[1010],w[1010];
 9 int f[1010][1010],g[1010][1010
]; 10 //f[i][j] 關掉[i,j]的代價,現在處在i,從右向左而來 11 //g[i][j] 關掉[i,j]的代價,現在處在j,從左向右而來 12 13 int main(){ 14 scanf("%d",&n); 15 scanf("%d",&v); 16 for(int i=1;i<=n;i++) scanf("%d%d",&d[i],&in),w[i]=w[i-1]+in; 17 memset(f,0x3f3f3f3f,sizeof(f)); 18 memset(g,0x3f3f3f3f,sizeof(g)); 19 f[v][v]=0; 20 g[v][v]=0; 21 for(int i=2;i<=n;i++)//已關的數目 22 for(int j=(v>=i?v-i+1:1);j<=v&&j<=n-i+1;j++){//左端點 23 int e=j+i-1;//右端點 24 f[j][e]=min(f[j+1][e]+(d[j+1]-d[j])*(w[n]+w[j]-w[e]),g[j+1][e]+(d[e]-d[j])*(w[n]+w[j]-w[e])); 25 g[j][e]=min(f[j][e-1]+(d[e]-d[j])*(w[n]+w[j-1]-w[e-1]),g[j][e-1]+(d[e]-d[e-1])*(w[n]+w[j-1]-w[e-1])); 26 } 27 printf("%d\n",min(f[1][n],g[1][n])); 28 return 0; 29 }

區間DP code[vs]1258 關路燈