題意:中文...
思路:話說這類題目做的真的很少,比賽時無從下手。首先我們不考慮組內之間的順序問題,將其轉化為組合。dp[i][j]表示第i組插入到佇列中存在j個空,該空的左右兩邊是同一組的人,這樣我們只要將第i + 1組的人查到該空的話,就是合法的。 這裡用了一下滾動陣列優化了一下。
dp[cur][i-k+x-j] +=dp[pre][i]*c[x-1][j-1]%mod*c[i][k]%mod*c[sum-i][j-k]%mod;
pre表示前一狀態,i表示列舉的前一狀態下,存在i個滿足上述條件的空。c[x - 1][j - 1]表示將當前組的x個人分成j組,然後往i個空裡面插。 c[i][k]表示選擇分成j組裡面的k組i組裡面插,c[sum - i][j - k]表示將插完剩下的人插入到不滿足上述條件的孔裡面。 i - k + x - j表示插入完成後所形成的的狀態。
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define cl(arr, val) memset(arr, val, sizeof(arr))
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll __int64
#define l(x) (x) << 1
#define r(x) (x) << 1 | 1
#define mid(l, r) (l + r) >> 1
#define min(x, y) (x) < (y) ? (x) : (y)
#define max(x, y) (x) < (y) ? (y) : (x)
#define e(x) (1 << (x))
#define iabs(x) (x) < 0 ? -(x) : (x)
#define out(x) printf("%i64d\n", x)
#define lowbit(x) (x)&(-x)
#define read() freopen("din.txt", "r", stdin)
#define write() freopen("dout.txt", "w", stdout);
#define m 307
#define n 450
using
namespace
std;
const ll mod = 1000000007
;ll a[
48];
ll dp[
2][n];
ll c[n][n];
intpre,cur,sum;
void
init()}a[
0] = 1
;
for (i = 1; i < 48; ++i)
}int
main()}}
}swap(pre,cur);
sum +=x;
jc = (jc*a[x])%mod;
}//printf("%i64d %i64d\n",dp[pre][0],jc);
ll ans = dp[pre][0]*jc%mod;
printf(
"case %d: %i64d\n
",cas++,ans);
}return0;
}
HDU4532 湫秋系列故事 安排座位
題面在這裡 有 n 種顏色的小球,每種顏色的小球有 a i 個 要把它們擺成一排,求相鄰小球顏色不相同的擺放方案數。任意兩個合理的安排方法,只要有乙個位置的同學不同,都被認為是不同的。n le 50,a i le 50,sum a i le 500 鳴謝ycb 以下先考慮可重排列的情況 考慮容斥 a...
HDU 湫秋系列故事 安排座位 組和DP
題意 中文.思路 話說這類題目做的真的很少,比賽時無從下手。首先我們不考慮組內之間的順序問題,將其轉化為組合。dp i j 表示第i組插入到佇列中存在j個空,該空的左右兩邊是同一組的人,這樣我們只要將第i 1組的人查到該空的話,就是合法的。這裡用了一下滾動陣列優化了一下。dp cur i k x j...
HDU4544 湫湫系列故事 消滅兔子
hdu 4544 tags 資料結構,貪心 analysis 將兔子的血量從大到小排序,將箭的殺傷力從大到小排序,對於每乙個兔子血量,將比他大的殺傷力大的劍壓入優先佇列,優先佇列自己重寫,讓它每次丟擲的數為價錢最小。code include include include include using...