演算法程式設計雜談

2021-09-20 07:22:52 字數 1938 閱讀 2879

1.並查集:陣列並查,高效的判斷資料是否在同一集合,套用**模板即可。

遞迴呼叫find(x);迴圈歸併merge(a,b);fd[a]=b;

2.揹包問題:分為0-1揹包,完全揹包,多重揹包 問題。

使用動態規劃,**簡介,功能強大,需要較多的時間去理解思考。也是電腦科學與程式設計神奇魅麗所在。

計算轉移方程,推薦二維陣列,理解方便。揹包問題在二維陣列中轉換。

可以壓縮成一維滾動陣列,計算好利用的儲存位置,進行壓縮。

有n件物品裝入容量為v的揹包。第i件物品費用是w[i],價值是p[i],求解不超過揹包容量的最大價值。

轉移方程:f[i][v]=max;

壓縮一維:for(int i=1;i<=n;i++) for(int v=v;v>=w[i];--v) f[v]=max(f[v],f[v-w[i]]+p[i]);   cout<3.果園裡有水果若干堆,現將所有水果合併成一堆。每一次合併,可以將兩堆水果合併到一起,消耗的體力等於兩堆水果重量之和。經過n-1次合併後,變成一堆。合併時消耗的體力等於每次合併消耗的體力之和。求設計出合適的合併次序方案,計算使得合併消耗體力之和最小。

假定每個水果重量均為1,如果有3堆水果,數目依次為1,2,9.可以先將1,2堆合併,耗費體力為3,再與第三堆合併,耗費體力為12,共耗費體力3-12-15.可以證明,15為最小體力耗費值。

水果堆數<=10000,每堆數目<=10000;  

解法:貪心+最小堆

priority_quequ < int , vector , greater > q;

優先佇列,最高優先順序總是第乙個出佇列。greater:從小到大 

4.動態規劃=遞迴+中間計算儲存 or 遞推

吉哥一共有m天的假期,每天的編號從1到m,一共有n份可以做的工作,每份工作都知道起始時間s,終止時間e和對應的工資c,每份工作的起始和終止時間以天為單位(即天數編號),每份工作必須從起始時間做到終止時間才能得到總工資c,且不能存在時間重疊的工作。比如,第1天起始第2天結束的工作不能和第2天起始,第4天結束的工作一起被選定,因為第2天吉哥只能在乙個地方工作。

現在,吉哥想知道怎麼安排才能在假期的m天內獲得最大的工資數(第m+1天吉哥必須返回學校,m天以後起始或終止的工作是不能完成的)。

input:第一行是資料的組數t;每組資料的第一行是2個正整數:假期時間m和可做的工作數n;接下來n行分別有3個正整數描述對應的n個工作的起始時間s,終止時間e,總工資c。

動歸:dp[i]表示到今天所能掙到的最多的錢,dp[i]= max(dp[i],dp[j]+a[j+1][i]);其中a[i][j]:從第i天到j天的工資。

int iholiday,iworks,istart,iend,isalary;

int iworkday[maxn][maxn];

int dp[maxn];

for(int i=0;iscanf(&istart,&iend,&isalary);

if(istart>iholiday || iend > iholiday) continue;

if(isalary>iworkday[istart][iend])  iworkday[istart][iend] = isalary;

}for(int i=1;i<= iholiday;++i)

for(int j=0;jdp[i]=max(dp[i],dp[j]+iworkday[j+1][i]);

5.工作室是乙個n行m列的矩形布局,小q暗自給每個同事進行了評分(為區別男女,男生一律用負整數,女生一律用正整數)。

現在,小q把所有人的資料記錄下來,並且這樣定義乙個位置的價值:

1、乙個位置的價值只和其上下左右四個鄰居的魅力值有關(對於靠邊的位置,只考慮其存在的鄰居);

2、如果某位置的鄰居和該位置主人性別不同,則總分加上鄰居魅力值的絕對值,否則減去;

3、對周圍所有鄰居的資料處理後,最終的得分即為這個位置的最終得分,得分越高,則該位置越好;

計算一下最佳位置?

程式設計雜談 spring

在spring中有三中例項化bean的方式 一 使用構造器例項化 二 使用靜態工廠方法例項化 三 使用例項化工廠方法例項化。spring bean的5種作用域 singleton作用域 spring的scope的預設值是singleton spring 只會為每乙個bean建立乙個例項,並保持bea...

Windows網路程式設計雜談

windows網路程式設計雜談 關於bind inaddr any 的具體含義是,繫結到0.0.0.0。此時,對所有的位址都將是有效的,如果系統考慮冗餘,採用多個網絡卡的話,那麼使用此種bind,將在所有網絡卡上進行繫結。在這種情況下,你可以收到傳送到所有有效位址上資料報。例如 sockaddr i...

qt程式設計問題雜談

1 乙個訊號可以連線多個槽,觸發一次訊號就發起了多個槽操作。2 qt下兩個執行緒之間可以用訊號和槽傳遞資料,但是當乙個執行緒一直迴圈執行,等待另乙個執行緒發來的資料的時候,當另乙個執行緒觸發了這個訊號時,如果這個執行緒一直輪循,其實屬於此執行緒的這個槽函式是不會被觸發的。3 qt下實現執行緒的函式是...