先來個鏈結,按上面的來做吧

2021-07-06 00:10:24 字數 3086 閱讀 9353

poj 1887

#include #include #include #include using namespace std;

const int maxn = (100000 + 10);

const int inf = 0x3f3f3f3f;

int n;

int num[maxn], dp[maxn];

int binary_search(int low, int high, int num)

else

} return low;

}int main()

memset(dp, 0, sizeof(dp));

int len = 1;

for (int i = 0; i <= n; i++)

printf("test #%d:\n", t++);

printf(" maximum possible interceptions: %d\n\n", len);

} return 0;

}

o(nlog(n))的做法,還有乙個n^2的做法,不再複述

以下是o(nlog(n))求最長上公升子串行的做法標準做法

#include using namespace std;

int find(int *a,int len,int n)//若返回值為x,則a[x]>=n>a[x-1]

}memset(dp,0,sizeof(dp));

for(int i=1;i<=f;i++)

for(int i=1;i<=f;i++)

for(int j=i+1;j<=v;j++)

printf("%d\n",dp[f][v]);

}return 0;

}

dp[i][j]表示前i束花放到前j個花瓶中所獲得的最大價值,於是有dp[i][j] = max(dp[i-1][j-1] + value[i][j], dp[i][j-1]) (i <= j <= m)(這是因為對於第i束花,可以選擇放在第j個花瓶中,也可以選擇放在前j - 1個花瓶中)

稍微要注意一下的就是初始化的問題了,由於是有序的放,因此dp[i][i] = dp[i-1][i-1] + value[i][i](1 <= i <= n)

poj 1088

記憶化搜尋(很多人把記憶化搜尋歸到dp裡)

#include #include #include #include #include #include using namespace std;

const int maxn = 100 + 10;

int dp[maxn][maxn],arr[maxn][maxn];

int dir[4][2]=,,,};

int r,c;

bool judge(int x,int y)

int dfs(int x,int y)

}return dp[x][y]=ans;

}int main()

}

poj 1014

這個題可以用貪心+剪枝做,也可以用01揹包,01揹包那個我看的不是很懂,貪心加剪枝的做法,有個作者講得很清晰,我就抄過來了

網上很多人說直接採用dp就可以了,但是我覺得不用那麼複雜,用貪心演算法

+回溯+剪枝就可以了,而且特快,執行時間為0.

1.首先,將所有石子價值先加,如果sum為奇數,則返回false.

2.然後,採用貪心策略在石子中選擇價值和為sum/2的組合,如果組合成功,返回true,否則false.

a).既然貪心,那當然首先選價值為6的石子,在不大於sum/2的前提下,盡量多選,假設數量為count。然後是價值為5,4,3,。。。

b).所謂回溯,就是當以上不能成功組合時,將count--,既少選乙個,然後又是5,4,3,。。。

c).如果僅僅採用以上的步驟,最終答案肯定是正確的,但是肯定也會超時。因為某一價值的石子最大數量為20000,如果count--,得遍歷多少啊。所以我們還要採用剪枝演算法。

以第一步選擇價值為6的石子為例,如果接下去的選擇價值為5的石子的數量超過6個,則我們可以用5個價值為6的石子替代;同樣,如果再接下去的選擇價值為4的石子的個子超過3個,我們也可以用2個價值為6的石子替代,依此類推。於是我們可以得到,在有足夠的價值為6的石子的前提下,設選擇6的個數為count,那麼必須有(sum/2 - count*6)<=(5*5+4*2+3+2*2+5)= 45.也就是回溯時count減小到一定數量不滿足以上不等式時就停止,這樣將剪去大部分的無用的搜尋。當然,接下去的選擇5,4,3都如此。

poj 1160

dp[i][j]表示前i個郵局設立在前j個村莊的最短距離和,sum[i][j]表示第i個村莊到第j個村莊建立乙個郵局的距離和,顯然,該郵局建立在i,j的中點位置最佳,於是我們可以得出:dp[i][j] = min(dp[i][j], dp[i-1][k] + sum[k + 1][j]) ( 1 <=k < j).而sum[i][j] = sum[i][j-1] + pos[j] - pos[(i + j) /2], 最後注意一下初始化就可以了。

#include #include #include #include #include #include #define inf 0x3f3f3f

using namespace std;

const int maxn = 300 + 10 ;

int arr[maxn];

int dp[maxn][maxn];

int sum[maxn][maxn];

int main()

memset(dp,inf,sizeof(dp));

memset(sum,0,sizeof(sum));

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

for(int j=i+1;j<=n;j++)sum[i][j]=sum[i][j-1]+arr[j]-arr[(i+j)/2];//畫畫圖就明白了,這步沒錯

for(int i=1;i<=n;i++) dp[1][i]=sum[1][i];

for(int i=2;i<=m;i++)

for(int j=i;j<=n;j++)for(int k=i-1;k

先來個前言吧

其實一直不是很喜歡在網上寫東西,以前也沒寫過,其實也是對把自己的想法公開的一種不習慣。但其實想想也沒什麼,說到底也沒多少人看,當然我也沒什麼需要隱瞞,所以決定了,要開始寫寫啦,很多事其實習慣就好。很多念頭不是說來就來的,就像我決定寫部落格,也不是某個下午忽然冒出的想法。我還是乙個很實際的人,往往是有...

nodejs初學 先來個hello World吧

好記性不如爛筆頭,記錄一下,萬一忘了以後可以翻出來看看.新建乙個名為1.js的資料夾 注意 檔名稱不能包含中文 require表示引包 引包就是引用自己的乙個特殊功能 建立伺服器 執行伺服器 監聽埠 server.listen 3000,127.0.0.1 部分就這些 然後dos視窗 進入你存放js...

編譯和鏈結那點事《上》

有位學弟想讓我說說編譯和鏈結的簡單過程,我覺得幾句話簡單說的話也沒什麼意思,索性寫篇博文稍微詳細的解釋一下吧。其實詳細的流程在經典的 linkers and loaders 和 深入理解計算機系統 中均有描述,也有國產的諸如 程式設計師的自我修養 鏈結 裝載與庫 等大牛著作。不過,我想大家恐怕很難有...