LSGDOJ 1852 青蛙的煩惱 DP

2021-08-22 10:19:19 字數 1254 閱讀 7273

池塘中有n片荷葉恰好圍成了乙個凸多邊形,有乙隻小青蛙恰好站在1號荷葉上,小青蛙想通過最短的路程遍歷所有的荷葉(經過乙個荷葉一次且僅一次),小青蛙可以從一片荷葉上跳到另外任意一片荷葉上。

第一行為整數n,荷葉的數量。

接下來n行,每行兩個實數,為n個多邊形的頂點座標,按照順時針方向給出。保證不會爆double。 

遍歷所有荷葉最短路程,請保留3位小數。 

4 50.0 1.0 5.0 1.0 0.0 0.0 45.0 0.0

50.211

對於所有資料,0題解:

因為凸多邊形性質:最短路徑一定不相交時,所以i-k的路徑中只會往i-1或k+1擴充套件

很明顯,右圖比左圖優,可以由三角形的三邊關係定理證明。

這樣,我們可以得出乙個結論,就是青蛙在一號結點只能跳到2號結點或者n號結點。

f[i][j][0]表示從i出發遍歷i~i+j-1的最短路徑,f[i][j][1]表示從i+j-1出發遍歷到i~i+j-1的最短路徑

f[i][k][0]=min(f[i+1][k-1][0]+dis[i][i+1],f[i+1][k-1][1]+dis[i+k-1][i]);

f[i][k][1]=min(f[i][k-1][1]+dis[i+k-2][i+k-1],f[i][k-1][0]+dis[i][i+k-1]);

#include#include#include#include#includeusing namespace std;

const int n=1550,inf=1999999999;

double x[n],y[n],dis[n][n],f[n/2][n/2][2];

int main()

for(int i=1,sz=(n<<1);i<=sz;i++)

for(int j=1;j<=sz;j++)

dis[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));

for(int k=2;k<=n;k++)

}printf("%.3lf",f[1][n][0]);

return 0;

}

18 5 2 stack常用介面

建構函式 建構函式 說明stackstk 預設建構函式 stack const stack stk 拷貝建構函式 賦值操作 賦值操作 說明stack operator const stack stk 等號運算子過載 資料訪問 資料訪問 說明push ele 向棧頂新增元素 pop 從棧頂移除第乙個元...

LSGDOJ 1333 任務安排 dp

題目描述 n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和 同一批任務將在同一時刻完成 ...

hdu1852 快速模冪

題目大意 給出n,k,s為2008的n次冪的所有因子和,m為s k,求2008的m次冪 k 分析 2008 2 3 251 故 2008 n 2 3n 251 n 設集合c sum c 2 3n 1 1 集合w sum w 251 n 1 1 250 則所有因子和為 s sum c sum w 因為...