dfs(cur) 表示從cur開始最少能分多少組
然後next是 使cur到next最大
然後
if( next - cur >= 3 )
if( next - cur >= 4 )
if( next - cur >= 5 )
這三個判斷是說 可以 分乙個給後面 或者分兩個給後面 或者乙個都不給後面 來組成新的小組
然後就a啦~~~~
ac**如下:
#include #include #include #include using namespace std;
#define max 0x3f3f3f3f
int dp[100010];
int k, n;
int pos[100010];
int dfs( int cur )
if( dp[cur] != -1 )
int next = upper_bound( pos, pos + n, pos[cur] + k ) - pos;
int ans = max;
if( next - cur >= 3 )
if( next - cur >= 4 )
if( next - cur >= 5 )
return dp[cur] = ans;
}int main()
sort( pos, pos + n );
memset( dp, -1, sizeof( dp ) );
int ans = dfs( 0 );
if( ans < max )else
} return 0;
}
Lightoj 1071 記憶化搜尋
題目的意思是說 在乙個二維的方格中有一些人需要幫助,你需要從左上角走到右下角,然後再返回左上角,而且每次走的不能重複,向下的時候只能向下或向右走,返回的時候只能向上或向左走,求最多能救的人數。這一題簡化一下就是要找兩條從左上到右下的路,且兩條路不能相交。可以用記憶化搜尋。用dp step r1 r2...
lightoj 1173 記憶化搜尋
題目的意思是有n個公升高不同的人,求高矮間隔排列的數目,並且依據題目的意思,隊長肯定在第乙個。然後這一題可以這樣想 a1 a2 a3 a4 a5.ak 表示已經排列好了的人,然後還有n個人 那麼用 dp n m 1 來表示 排剩下的n個人,並且這n個人中有m個人比ak高,且接下來排的第乙個人要比ak...
skiing 記憶化深搜
這道題就是找出一條最長連續遞減序列,並求出其長度。可以用記憶化深搜,求出每一點最長序列的長度,然後求最大值即可。如下 include includeusing namespace std const int n 105 int a n n m,n,f n n inline int max int a...