bzoj 4321: queue2
阿新 • • 發佈:2018-03-04
const fin use sin amp div www mst urn
Submit: 475 Solved: 287
[Submit][Status][Discuss]
樣例解釋:有兩種方案 2 4 1 3 和 3 1 4 2 設f[i][j][k]為排完1-i之後,有j對相鄰位置差一,並且i是否和i-1相鄰的方案數。 然後隨便推一推轉移就好了,這裏稍微提一下怎麽推轉移,至於最後的式子看代碼就好了。 首先,我們看一下f[i][j][0]可以轉移到哪些狀態: 1.我們在i的兩邊放i+1,都會讓差一的相鄰位置+1。 所以f[i+1][j+1][1]+=2*f[i][j][0]。 2.我們在j對差一的相鄰位置中間放i+1,都會讓差一的相鄰位置-1。 並且因為i於i-1不相鄰,所以j對裏不用減去,並且放完之後i+1和i不相鄰,所以就是:
f[i+1][j-1][0]+=j*f[i][j][0]。
3.在剩下的i-j-1個空擋裏放,不僅i和i+1不相鄰,並且相鄰差一的不會增多,
所以f[i+1][j][0]+=(i-j-1)*f[i][j][0]。
f[i][j][1]的情況類似,推一下就好了。
4321: queue2
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 475 Solved: 287
[Submit][Status][Discuss]
Description
n 個沙茶,被編號 1~n。排完隊之後,每個沙茶希望,自己的相鄰的兩 人只要無一個人的編號和自己的編號相差為 1(+1 或-1)就行; 現在想知道,存在多少方案滿足沙茶們如此不苛刻的條件。
Input
只有一行且為用空格隔開的一個正整數 N,其中 100%的數據滿足 1≤N ≤ 1000;
Output
一個非負整數,表示方案數對 7777777 取模。
Sample Input
4Sample Output
2樣例解釋:有兩種方案 2 4 1 3 和 3 1 4 2 設f[i][j][k]為排完1-i之後,有j對相鄰位置差一,並且i是否和i-1相鄰的方案數。 然後隨便推一推轉移就好了,這裏稍微提一下怎麽推轉移,至於最後的式子看代碼就好了。 首先,我們看一下f[i][j][0]可以轉移到哪些狀態: 1.我們在i的兩邊放i+1,都會讓差一的相鄰位置+1。 所以f[i+1][j+1][1]+=2*f[i][j][0]。 2.我們在j對差一的相鄰位置中間放i+1,都會讓差一的相鄰位置-1。 並且因為i於i-1不相鄰,所以j對裏不用減去,並且放完之後i+1和i不相鄰,所以就是:
/************************************************************** Problem: 4321 User: JYYHH Language: C++ Result: Accepted Time:484 ms Memory:9180 kb ****************************************************************/ #include<bits/stdc++.h> #define ll long long #define maxn 1005 using namespace std; const int ha=7777777; int f[maxn][maxn][2]; int n; inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x; } inline void dp(){ f[1][0][0]=1; for(int i=1;i<n;i++) for(int j=0;j<i;j++){ int ans=f[i][j][0]; if(ans){ f[i+1][j+1][1]=add(f[i+1][j+1][1],add(ans,ans)); f[i+1][j][0]=add(f[i+1][j][0],ans*(ll)(i-j-1)%ha); if(j) f[i+1][j-1][0]=add(f[i+1][j-1][0],ans*(ll)j%ha); } ans=f[i][j][1]; if(ans){ f[i+1][j+1][1]=add(f[i+1][j+1][1],ans); f[i+1][j][1]=add(f[i+1][j][1],ans); f[i+1][j][0]=add(f[i+1][j][0],ans*(ll)(i-j)%ha); if(j) f[i+1][j-1][0]=add(f[i+1][j-1][0],ans*(ll)(j-1)%ha); } } } int main(){ cin>>n; dp(); cout<<f[n][0][0]<<endl; return 0; }
bzoj 4321: queue2