題意:
有n個寶藏,每個都在乙個位置p[i],在規定的時間t[i]就會消失。阿里巴巴要在寶藏消失前收集齊所有寶藏,問:有方法嗎?有的話最少多少秒?
思路:開始想的是用狀態轉移方程來乙個個判斷,不好寫。看了題解知道在一段區間[l,r]要使時間最短必須從端點出來,然後果斷寫了乙個記憶化搜尋,tle了。再看題解,所有的遞迴函式都可以優化成,遞推表示式。寫了乙個遞推過了。
線上的動態規劃必定要開倆自變數l,r。因為要判斷是從l還是r出,加乙個自變數p(0:從 l 出 ;1:從 r 出)
可以知道dp[l][r][0]=min (dp[l+1][r][0]+a[l+1]-a[l] , dp[l+1][r][1]+a[r]-a[l]);
dp[i][j][1]=min( dp[i][j-1][1]+a[j]-a[j-1] ,dp[i][j-1][0]+a[j]-a[i]);
這樣子遞推的循序也出來了
i--,j++;
當dp[l][r][p]>=b[l/r][p]時,將dp[l][r][p]=inf,表示不符合題意;
個人感悟:
刷題就把自己當個逗逼吧!
//tle dfs
#include#include#include#include#includeusing namespace std;
const int maxn=10000+10;
const int inf=0x3f3f3f3f;
int a[maxn];
int b[maxn];
int dp[maxn][maxn][2];
int dfs(int l,int r,int p)
if(p==0)
}else if(p==1)
}return dp[l][r][p];
}int main()
// memset(dp,0,sizeof(dp));
for(int i=n;i>0;i--)
dp[i][j][1]=min( dp[i][j-1][1]+a[j]-a[j-1] ,dp[i][j-1][0]+a[j]-a[i]);
if(dp[i][j][1]>=b[j])}}
int ans=min(dp[1][n][0],dp[1][n][1]);
if(ans==inf)
else
}return 0;
}
紫書 習題 9 8 uva 10163
解題感想 好久沒刷題了,自己連揹包dp都差不多忘了。題目看著很複雜,可以將問題分解來看,和高中數學題的感覺一樣 1.求任意一組組合的最小的保護值 的最大值 2.求在改最大組合的情況下的,求最小的工資和,和某圖論一樣的思路。解題思路 第乙個揹包 任意組合 抽象成模板 在n個應聘者中選x人使得看守m個倉...
紫書 習題8 12 UVa 1153(貪心)
本來以為這道題是考不相交區間,結果還專門複習了一遍前面寫的,然後發現這道題的區間是不是 固定的,是在乙個範圍內 滑動的 只要右端點不超過截止時間就ok。然後我就先考慮有包含關係的時候怎麼選,然後發現當兩個區間只能放乙個的時候時間更短而截 至時間更長的時候,顯然更優。然後我就試著每個區間放的時候後後面...
紫書 習題 8 15 UVa 1617 (貪心)
先排序,然後每個線段先放右端點,然後往下放,如果不能放就整體往左移動,當不能往左移動的時候就ans 開始下乙個整塊。判斷能不能向左移動要用乙個變數儲存每個已經放了的區間中線段與左端點距離的最小值。include include define rep i,a,b for int i a i b i u...