最開始想是旅行商問題,因為最終要回到起點,但是如果遍歷完所有的點了,回去的話,不會有悲傷值增加的情況
還沒有想明白為什麼區間dp可以求解這個問題???後面再更新
分析一下這個題:假設現在已經遍歷到了區間[l,r],前提為中間的所有區間的數值已經知道了,那麼可以一步轉換到當前狀態的為[r+1,l]、[r,l-1],那麼當前狀態下,快遞員所在的位置我們也不知道,所以我們將dp拓展為三維dp[i][j][k] 如果k==0,表示當前在位置i,k==1,表示當前在位置j,那麼就可以得到新的狀態
#include #include #include #include using namespace std;
const int maxn=1010;
const int inf=0x3f3f3f3f;
struct node
;node node[maxn];
int dp[maxn][maxn][2];
bool cmp(node a,node b)
//這裡回去的話我們不用擔心,因為已經送完了,那麼最終的答案就不會再增長了
printf("%d\n",v*min(dp[1][n][0],dp[1][n][1]));//本題的v一定要留到後面來乘,中間dp的時候乘可能會溢位
}return 0;
}
3個區間DP總結
include include include include include include include include 自動從小到大排序,且沒有重複 using namespace std const int maxn 100 5 const int inf 1e9 int n int a ...
week 3 B 區間選點
數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 乙個整數,代表選點的數目 21 5 4 63 1 32 5 4 6該題的貪心策略是 選取區間的最後乙個點...
week3 B 區間選點
數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 input 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 output 乙個整數,代表選點的數目 sample input 215 46sample ...