dp的難點在於狀態的確定和轉移方程的推導.
在本題中,我們可以從頭列舉,去觀察歸納,找到本題的最優子結構.
假設有\(k=1,a=[3,2,1]\).對於第乙個數字1,它的數字一定是固定的——只能在最左上角;對於第二個數字,它可以位於1的右邊,也可以在1的下邊……
通過列舉擺放的情況後,我們可以發現:
第\(i\)行的擺放數字的數量不超過\(a_i\)
除了第一行之外,其他行擺放的數量都不超過上一行
為了保證題目中的要求,每個元素安放位置的列舉順序也是按照從小到大開始的,那麼我們可以讓列舉過的元素組成乙個集合,可以發現,元素放置的位置,即放置好的元素構成的形狀,影響當前這個集合對應的方案數量
這樣可以將乙個子結構定義成f[a1][a2][a3][a4][a5]
,\(a_k\)代表第\(k\)行擺放的元素的數量,對於擺放行數不夠的情況,預設擺放成0
這樣一來,我們就可以得到轉移方程:在合法的情況下,f...[k + 1]... += f...[k]...
邊界條件為f[0][0][0][0][0]=1
#include #include using namespace std;
typedef long long ll;
constexpr int n = 33;
ll f[n][n][n][n][n];
int n;
int s[n];
int main()
printf("%lld\n", f[s[1]][s[2]][s[3]][s[4]][s[5]]);
} return 0;
}
楊老師的照相排列(線性dp)
題意 有n個人,身高分別是1,2,3,4 n,將這n個人排隊,要求從前 上面 往後 下面 身高增,從左往右身高也遞增。要求組成k排,每排需要的人數給出,問你有多少種排列的方法。比如n 6,k 3,n1 3,n2 2,n3 1 那麼 123 456就是一種合法排列。資料範圍 1 k 5,學生總人數不超...
題解 AcWing271 楊老師的照相排列
題面 經典的線性 text 設 dp 表示第 1 排有 a 個人,第 2 排有 b 個人,第 3 排有 c 個人,第 4 排有 d 個人,第 5 排有 e 個人的方案數。初始化 dp 1 可以發現乙個性質 前排的人數一定比後排的人數多。轉移可以參考 include define debug fpri...
楊濤老師MvcPager示例
一 標準的ajax分頁 1 新建乙個空的mvc專案 2 搜尋安裝 mvcpager 3 控制器中新增方法 4 新增檢視 singlepage.cshtml 分部檢視 articlelist.cshtml articletable.cshtnl singlepage.cshtml 1 using we...