論dp的百種用法之一
因為dp必須有一種全面的狀態,但是這道題……似乎排列等等問題都不是dp擅長處理的地方。
首先分析性質。我們發現,這種不能放在一起的關係具有傳遞性。因為如果\(xy=a^2,xz=b^2\),那麼\(yz=\dfrac=\dfrac=\big(\dfrac\big)^2\)。
具有傳遞性的話,我們就會發現,所有不能放在一起的位置,構成了多個團(完全圖)。
我們就想著把每個團裡的所有球都染上同一種顏色,則相同顏色的球不能緊貼在一起。
則我們現在將問題轉換為:給你\(n\)個染了色的球,相同的球不能放一起,求排列數。
考慮將這些球按照顏色排序,這樣便有了乙個合理的(可以抽象出狀態的)dp順序。
我們設\(f[i][j][k]\)表示:
當前dp到第\(i\)位,
有兩個球放在一起,它們的顏色相同,並且顏色與第\(i\)位的球不同,這樣的對共有\(j\)個,
有兩個球放在一起,它們的顏色相同,並且顏色與第\(i\)位的球相同,這樣的對共有\(k\)個,
的方案數。
因為我們已經排過序,因此顏色相同的球必定緊貼。
則dp狀態的第三維(即\(k\))必為\(0\),因為不存在在它之前並且和它顏色相同的球。我們只需要列舉第二維\(j\)。
1.1.我們將這個球放在兩個顏色不同的球之間。
我們列舉乙個\(k'\),表示上乙個球所代表的顏色中顏色相同且緊貼的對共有\(k'\)個(\(k'\in[0,j]\))。
則有f[i][j][0]+=f[i-1][j-k'][k']*(i-j)
,因為共有j-k'
個相鄰且相同且和上乙個球的顏色不同的位置,並且共有i-j
個可以放球的位置。
1.2.我們將這個球放在兩個顏色相同的球之間。
我們仍然列舉乙個\(k'\),意義相同。這時,\(k'\in[0,j+1]\)。
則有f[i][j][0]+=f[i-1][j-k'+1][k']*(j+1)
。因為放入這個球后就拆開了一對球,因此原來共有 \(j+1\) 對這樣的球。
我們需要列舉剩餘兩維\(j,k\)。並且,設在第\(i\)位之前,有\(cnt\)個和第\(i\)位相同的位置。
2.1.我們將這個球放在某個和這個球顏色相同的球旁邊。
則共有\(2*cnt-(k-1)\)個這樣的位置。
因此有f[i][j][k]+=f[i-1][j][k-1]*(2*cnt-(k-1))
。
2.2.我們將這個球放在兩個顏色相同的球之間。
同1.2,有f[i][j][k]+=f[i-1][j+1][k]*(j+1)
。
2.3.我們將這個球放在兩個顏色不同且與這個球顏色不同的球之間。
這次操作沒有新增或刪除任何對,並且共有\(i-(2*cnt-k)-j\)個位置。
因此有f[i][j][k]+=f[i-1][j][k]*(i-(cnt*2-k)-j)
。
**:
#includeusing namespace std;
const int mod=1e9+7;
typedef long long ll;
int n,num[310],dsu[310],f[2][310][310];
vectorv;
int find(int x)
void merge(int x,int y)
bool che(ll ip)
int main()
}else
} cnt++;
} printf("%d\n",f[n&1][0][0]);
return 0;
}
AHOI2018初中組 二分查詢 分組
最開始是想二分答案的,但是沒有考慮到資料中重複的數值的情況,50 分 wa 了。但是這題顯然適合二分查詢 當我們的資料 在陣列中是線性排列的,就可以使用二分查詢。需要兩個輔助陣列 你甚至還會發現這題有點蜘蛛紙牌那味 霧 不多說閒話,下面是 二分查詢 設計乙個陣列 g 表示第 i 個分組中 需要加入的...
JZOJ A組 球 題解
球 ball 問題描述 小 t 有 n 個桶和 2n 1 個球,其中第 i 個桶能裝前 2i 1 個球。每個桶只能裝乙個球。現在小 t 取了 m 個桶和 m 個球,並將這些球各自放在這些桶裡。問這樣的方案有多少。兩種方案不同當且僅當選擇了不同的桶或球或者同乙個桶在兩種方案放了不同的球。由於方案的數量...
AHOI2017初中組解題報告
題目描述 乙個n n的網格圖上有m個探測器,每個探測器有個探測半徑r,問這n n個點中有多少個點能被探測到。輸入格式 第一行3個整數n,m,r 接下來m行,每行兩個整數x,y表示第i個探測器的座標 輸出格式 能被探測到的點的個數 樣例輸入 5 2 1 3 3 4 2 樣例輸出 8 資料範圍 1 n,...