Time of Update: 2018-12-03
多重背包,二進位轉化為01背包後可解存在性問題 dp【i】【j】=dp【i-1】【j】|dp【i-1】【j-coin【i】】;位元運算#include<iostream>#include<string.h>using namespace std;const int maxn=100005;int bit_mask[30],nn;int coin[maxn],num[101],value[101];bool dp[maxn];void change(int );int
Time of Update: 2018-12-03
/*應用同餘定理類比就好,讓m從小到大遞增注意驗證是否滿足條件即可。因為求的是同餘所以bool數組可以比資料範圍小10^(-1)倍。。。否則會逾時。。。*/ Source CodeProblem: 2769 User: imutzcyMemory: 280K Time: 454MSLanguage: C++ Result: AcceptedSource
Time of Update: 2018-12-03
DP,注意單組輸入,題目的進程無後效性,適合DP,由於當時沒有估計出車子數量,用了滾動數組。現在來談下DP狀態的表示,比較容易想到的是DP【i】【j】【k】(現在的車子編號,隊列1長度,隊列2長度)明顯MLE,其實我們只需要有前兩維即可,因為最後一維可以從前面兩維推知:k=sum【i】-j;問題轉為存在性問題了,dp【i】【j】=dp【i-1】【j】|dp【i-1】【j-len【i】】(分別為放在隊列1,放在隊列2)注意細節處理詳情見代碼:#include<stdio.h>#incl
Time of Update: 2018-12-03
這個題目有必要標記下,和hdu的最大矩形面積一樣,分為兩類DP,最後枚舉求解連結:http://www.cppblog.com/hanfei19910905/archive/2012/06/30/180831.aspx題意:有N個點,點與點之間存在通過次數被限定的橋,每通過一次橋,能獲得一分,問你最多能獲得多少分(起點自己決定)解析:從左邊DP一次起,右邊DP一次,dpl【i】【0】從i點出發遍曆0 - i 點不回來,dpl【i】【1】表示從i點出發遍曆0 - i
Time of Update: 2018-12-03
自己寫果斷逾時了,看了大神的剪枝,果然好強悍,附上剪枝題目大意:這道題就是講有一隻狗要吃骨頭,結果進入了一個迷宮陷阱,迷宮裡每走過一個地板費時一秒,該地板就會在下一秒塌陷,所以你不能在該地板上逗留。迷宮裡面有一個門,只能在特定的某一秒才能開啟,讓狗逃出去。現在題目告訴你迷宮的大小和門開啟的時間,問你狗可不可以逃出去,可以就輸出YES,否則NO。解題思路:這道題,要用到剪枝搜尋來做,否則會逾時。剪掉的條件是,如果可走地板數目小於給定的時間,絕對不可能得救。還有就是狗走到門的時間必須和題目給定的時間
Time of Update: 2018-12-03
搜尋真的理論上能解決所有問題,特別是對於資料量小的題目,繼續練習,為DP做準備#include<stdio.h>#include<stdlib.h>#include<string.h>#define Max 9int adj[35][35];int stop[Max],moved[Max],min,n,k;int cmp(const void *a,const void *b){return *(int *)a-*(int
Time of Update: 2018-12-03
Happiness!Input: standard inputOutput: standard outputTime Limit: 3 secondsProf. Kaykobad has given Nasa the duty of buying some food for the ACM contestents. Nasa decided to buyn different items. He then asked each of them contestents how much of
Time of Update: 2018-12-03
/*人左右走動,求影子L的最長長度。根據圖,很容易發現當燈,人的頭部和牆角成一條直線時(假設此時人站在A點),此時的長度是影子全在地上的最長長度。當人再向右走時,影子開始投影到牆上,當人貼著牆,影子長度即為人的高度。所以當人從A點走到牆,函數是先遞增再遞減,為凸性函數,所以我們可以用三分法來求解。*/ #include<functional>#include<algorithm>#include<iostream>#include<fstream>
Time of Update: 2018-12-03
flag【i】【j】表示以現在這個位置為起點的最遠能走的長度,熟悉下遞迴,這個題應該不難,記憶化#include<stdio.h>#include<string.h>#define Max 105#define Maxhigh 10005typedef struct {int x,y;}position;position move[4]={-1,0,0,1,1,0,0,-1};int flag[Max][Max];int maze[Max][Max];void wall(
Time of Update: 2018-12-03
/*很裸很裸的指數型母函數。。。(注意:指數形式的母函數由於除以了大數,所以精度序號控制,否則會WA N多次)Ans= x ^ m的係數 * (m !)*/ Problem : 1521 ( 排列組合 ) Judge Status : AcceptedRunId : 7628739 Language : C++ Author : CherryChouCode Render Status : Rendered By HDOJ C++ Code Render
Time of Update: 2018-12-03
題目連結 hdu 2955 Robberies01背包,轉化為求被抓的機率。 題目連結 hdu 1864 最大報銷額 01背包,每張發票的總額為容量和價值,注意預先處理資料,對於浮點數,向大牛cxlove學了處理(%d.%d)接收小數 題目連結 hdu 1506 Largest Rectangle in a Histogram 用了動態規劃的思想,用兩個dp數組表示左邊和右邊的最長連續,詳情見題解:點擊這裡 題目連結 hdu
Time of Update: 2018-12-03
/*題意:每一行輸入的6個數,第 i 個數表示價值為 i 的珠寶的個數,問這些珠寶是不是能等價平分給兩個人*//*解法:1、最簡單的方法就是用dfs搜尋就行(占坑) 2、完全背包的基礎題(占坑) 3、母函數。總價值 value=(∑( i * num )),如果value為奇數,那麼珠寶不可分。當value為偶數是,就可利用母函數,轉化為考察 ( x ^ value ) / 2
Time of Update: 2018-12-03
比較明顯的DP,由於資料比較小(maxn==10)所以狀態壓縮dp直接搞#include<iostream>#include<algorithm>#include<string.h>using namespace std; const int maxn=1025;int dp[maxn],pow[12][12],bit_mask[15];//0表示存活,1表示死亡int main(){int
Time of Update: 2018-12-03
我們要求最大矩形面積,那麼我們應該求每個矩形向兩邊延伸的最大長度,最壞情況為0(n),必然TLE,那麼我們可以應該DP的思想,用一個數組來儲存一些結果。例如,dpl【i】表示從左邊過來的最長,那麼我們計算dpl【i】的時候,如果左邊的比自己高,那麼dpl【i】=dpl【i-1】,但是可能在前面還有更多符合情況的(比i-1低但是比i高),所以我們要用i-1-dp【i-1】,繼續尋找,詳情看代碼#include<iostream>#include<string.h>#defi
Time of Update: 2018-12-03
樹狀數組(Binary Index Tree)利用二進位的一些性質巧妙的劃分區間,是一種編程,時間和空間上都十分理想的求區間和的演算法,同樣我們可以利用樹狀數組優美的區間劃分方法來求一個序列的最值約定以 num[] 表示原數組, 以 idx[] 表示索引數組, Lowbit(x)=x&(-x) 樹狀數組求和時通過構造數組 idx[] 使 idx[k]=sum(num[tk]), tk [k-Lowbit(k)+1,k], 使用同樣的方法構造最值索引數組:以最大值為例,
Time of Update: 2018-12-03
自己感覺這道題還是挺難得,,不容易想。題目讓求最多有多少個兒童,,首先逆向轉化成求不認識的兒童,,然後再建圖轉化成最小點集覆蓋。。。挺難的。題目:KindergartenTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 3409 Accepted: 1599DescriptionIn a kindergarten, there are a lot of kids. All girls of the kids
Time of Update: 2018-12-03
題意描述不太好,說好是A+B,卻可以B+A,雖然理論上是這樣,但我覺得題意說清楚些比較好我的做法和網上的題解不一樣,比如asdf sdfg我把第一個字串接在第二個的後面,形成sdfgasdf,長度一共為8,然後找next【8】,next【8】就是最長公用串的長度(為什麼是這樣,請看題解poj 2752)然後把第二個字串接在第一個的後面,再找下,最後對比下哪個長點,就輸出哪個,有個東西不好處理,aaaaaaaa
Time of Update: 2018-12-03
#include<stdio.h>#include<string.h>int hash[2005][2005];int treat[2005];int num;int dfs(int head,int tail,int n);int main(){ int i,k; while(scanf("%d",&num)!=EOF) { memset(hash,0,sizeof(hash)); for(i=0;i<num;
Time of Update: 2018-12-03
以前用過線段樹求逆序數,這次想用樹狀數組試一下,悲催的是想了好久才想明白。。。。看來對樹狀數組還是不夠瞭解啊。糾結。。。。題目:Minimum Inversion NumberTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2413 Accepted Submission(s): 1492Problem
Time of Update: 2018-12-03
這是原始版的精確尋找int search(int a[],int low,int high,int key){int mid;while(low<=high){mid=(low+high)/2;if(a[mid]>key)high=mid-1;else if(a[mid]<key)low=mid+1;else return mid;}return -1;}這是尋找大於等於的int search(int a[],int low,int high,int key){int mid;