Time of Update: 2018-12-03
這道題還是比較難想出來的,我也搞了好久才搞懂,而且是在問了大牛的基礎上才搞清楚的。反而覺得黑書上沒有講清楚,現在我們來具體看看這道題的思路吧。
Time of Update: 2018-12-03
Polya定理: 設G是一個p個對象的置換群,那麼用k種顏色對p個對象進行染色!當一種方案在群G的作用下變為另外一種方案,那麼我們這個時候就認為這兩個方案是一樣的。那麼在這種規定下不同的染色方案為:n=(Ek^m(f))/|G|,其中m(f)是置換f的迴圈節。 Polya定理是基於Burnside定理和另外一個定理的,其中Burnside定理的通俗表達方法如下:
Time of Update: 2018-12-03
這道題,一看題大概就知道是線段樹。 對於這種題通常來說就是看節點中如何記錄資訊了…… 這道題我們使用:v記錄區間的改變值,也就是在update過程中累加的改變值Max表示整個區間的最大值Min表示整個區間的最小值當然還有l和r不用說了。
Time of Update: 2018-12-03
這道題的大概意思就是說有n支隊伍,t道題,並且給你每支隊伍答對每道題的機率,然後問你的就是使所有隊伍都過至少一道題,並且第一名的隊伍答對至少m道題的機率是多少。 我們先看下如何解決一個隊伍的情況,比如說,有t道題,那麼我們如何求答對k(t>=k>=0)道題的機率呢?我們考慮使用dp進行遞推!定義dp[i][j]表示前i道題中答對j道題的機率,這個時候我們就可以很簡單的寫出狀態轉移方程如下:dp[i][j]=dp[i-1][j]*(1-p[i])+dp[i-1][
Time of Update: 2018-12-03
這道題一看就是動態規劃……首先確定如何定義狀態,定義dp[i][j]表示跑完第i段路,保留j段能量的花費時間的最小值。那麼我們的轉移方程也比較好寫,因為j最多可以到達14,所以第二維直接開到15就夠了。狀態轉移還是看代碼吧,細節小心就好了。#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#define INF (long
Time of Update: 2018-12-03
這道題給的是一個矩陣板,我們撇開這個板,看單獨的一行的時候兩個人進行博弈的情況。因為根據sg局勢的定義,我們只要將所有的局勢進行異或就能得到所求的整個棋局的狀態。
Time of Update: 2018-12-03
我們知道貝蒂定理是描述一類整數劃分的方法,貝蒂定理如下:1/a+1/b=1,這裡的a,b都是正的無理數,那麼我們就有P={[ma]|m為正整數},Q={[mb]|m為正整數},此時P與Q的交為空白集,P與Q的並正好就是Z+這個集合。 對於POJ1067這道題來說,很明顯就是博弈,我們使用sg函數爆出sg值之後就會發現,sg[i][j]為0若且唯若i,j正好是Z+的一個劃分。並且j=i+k,k表示第幾個這種數對。 於是我們使用貝蒂定理,i[k]=[ka]
Time of Update: 2018-12-03
我們把忍耐度作為背包容量,把經驗值作為價值,增加一維數量的限制,那麼這道題就是典型的背包問題。我們定義dp[j][k]表示背包容量為j,選擇k件物品所能達到的最大的價值。其實這是前面省略了一維的結果,我們可以更清晰的定義dp[i][j][k]表示前i中物品中,背包容量為j的背包選擇k件物品所能達到的最大值,我們列開狀態轉移方程之後,發現可以省略前面一維保持答案的正確性,因此我們採用第一種定義來最佳化空間。狀態轉移比較簡單,看看代碼就知道了。#include
Time of Update: 2018-12-03
對於n個給定的不同的數,我們可以將任意一個排列看成是一個置換。於是對於POJ 3270這道題,我們這樣看:首先給你的一個n個任意不同的數形成一個排列,然後我們對這個排列中的數從小到達排序。題目中要求的就是要形成升序的排列。那麼我們把輸入的那個排列看成是一個置換。
Time of Update: 2018-12-03
POJ 1655 Balancing Act 簡單樹狀DPhttp://poj.org/problem?id=1655這道題目題意是說,任意刪除樹中的一個點,那麼被分成幾棵樹之後,子樹中點數最大的值就是該點的balance,求具有最小Balance的點。我們用num[i]表示以i為根節點的子樹所包含的點的個數,那麼該點的balance就是最大那個num[i]值了,比較簡單,要是不會就看看代碼吧,這道題很簡單!#include <iostream>#include
Time of Update: 2018-12-03
一看這道題,感覺有點像今年多校的一道題,但是一看資料n的大小達到了10^4,那麼如果建圖跑的話要T,因為建圖的複雜度差不多N^2的,於是不能用多校的那道題的做法。 我們看看給的l和r的資料範圍比較小,1到100,那麼我們使用一個dp資料記錄dp[i][j]表示(i,j)出現的次數,然後我們按照題目要求的規則便是需要i>=i'&&j>=j',於是我們定義狀態dp[i][j]表示i'<=i&&j'<=j的最大的累加和,
Time of Update: 2018-12-03
Time of Update: 2018-12-03
通常來說,母函數的思想就是使用冪級數來表示一個離散數列。例如對於一個數列是a={a0,a1,a2,-------ak},那麼我們可以母函數的定義就是G(x)=a0+a1*x+a2*x^2+a3*x^3------an*x^n,這裡的G(x)就是數列a的母函數。 母函數可以用來解決整數拆分問題,下面舉一個例子來說明。 例如我們有重量為1克、2克、3克、4克的砝碼各一個,那麼問你這些砝碼可以稱出幾中重量?每一種重量有多少種方案數?
Time of Update: 2018-12-03
下面的題目都是更新點尋找區間或者是更新區間尋找點的題目,這一類屬於比較簡單的線段樹的題目,可以用來入門或者加強對線段樹的理解。後面幾道稍微有點難想到,但是想到怎麼使用線段樹之後就是簡單的是用線段樹了。HDU 1754http://acm.hdu.edu.cn/showproblem.php?pid=1754簡單的更新點的值,尋找區間的最大值,很好寫。HDU
Time of Update: 2018-12-03
HDU 1689http://acm.hdu.edu.cn/showproblem.php?pid=1698這道題是使用懶操作的入門級的題目,線上段樹的結構體中,加一個flag標記該區間是否是同色的。當為同色,那麼在更新或者查詢的時候就可以偷懶了,有效降低時間複雜度。//hdu 1698#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#define
Time of Update: 2018-12-03
這道題是典型的多重背包題,就是說給你的物品有一個去的件數的上限,我們常用的解決多重背包問題的方法是:將件數乘以費用超過背包容量的物品可以使用完全背包的方法進行求解;除此之外的物品我們採用二進位的思想,將該物品的件數拆分成二進位上的數後,看成一個物品進行01背包。這樣通過這兩種方法就可以解決多重背包問題。下面是我的ac代碼參考:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX
Time of Update: 2018-12-03
題意: 這道題的題意是說給你n個數順時針圍成一個圈,用最少的相鄰交換的次數,將其轉變成為逆時針的一個圈。我們從較小的例子進行考慮,當n為偶數的時候,我們將前n/2 = m個數順序全反最少的交換次數為m*(m-1)/2,那麼將n個數最小的交換次數便是m*(m-1)。而對於n為奇數的時候,我們首先將最大一個數轉移到對應的逆時針的圈的交換次數為n/2,剩餘的(n-1)個數同偶數的情況是相同的。這個題比較簡單,自己比劃一下就能想通……Java代碼:import
Time of Update: 2018-12-03
HDU 1540 Tunnel Warfare這道題中我們用0表示該點是好的,1表示已經被毀壞。那麼這道題就是更新點尋找區間的線段樹,但是為了能夠求某個點連續的0的個數,我們線上段樹內需要記一個區間左右端點連續的0的個數。這樣當查詢的時候,分成兩邊來查詢,然後判斷一下點本身是否為被毀壞就行了。詳細見代碼:#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#
Time of Update: 2018-12-03
這道題就是整數的劃分,其實定義好了狀態,就是簡單的動態規劃的遞推。我們定義dp[n][k]表示將n進行劃分,最大的數不超過k的方案有多少種,那麼我們可以得到如下的遞推方案:dp[n][k] = dp[n][k-1] +
Time of Update: 2018-12-03
給你一個n*m的矩陣,讓你輸出如下的數字矩陣:01 06 0502 03 04如下:就是這樣,然後自己就寫了一發:代碼貼出來供參考:#include <stdio.h>#define MAX 1000using namespace std;int maze[MAX][MAX];int Update(int n,int m,int &sx,int &sy,int cnt,int sum){ if(n==1&&m==1) {