HDu 6321 Dynamic Graph Matching(状態圧縮)
4759 ワード
http://acm.hdu.edu.cn/showproblem.php?pid=6321
1つの図にN個の点といくつかの質問があり、1個の質問ごとに1つの辺を増やしたり削除したりして、1個の質問出力ごとに1~N/2個の交差しない辺を選択する案数.
考え方:n=10のため,状態圧縮でこの問題を処理することができ,この辺を加えると,この辺の2つの端点のバイナリ位置はいずれも1として表される.
1つのエッジaを加えるたびに、bは、あるiのバイナリa−とb−の対応する位置が1である場合、すなわち、この状態はi−(1<
1つの図にN個の点といくつかの質問があり、1個の質問ごとに1つの辺を増やしたり削除したりして、1個の質問出力ごとに1~N/2個の交差しない辺を選択する案数.
考え方:n=10のため,状態圧縮でこの問題を処理することができ,この辺を加えると,この辺の2つの端点のバイナリ位置はいずれも1として表される.
1つのエッジaを加えるたびに、bは、あるiのバイナリa−とb−の対応する位置が1である場合、すなわち、この状態はi−(1<
#include
using namespace std;
const int mod=1e9+7;
#define ll long long
ll dp[1111];
int cnt[1111];
ll ans[11];
void init()
{
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=1023;i++)
{
int x=i;
int f=0;
while(x)
{
if(x&1)f++;
x>>=1;
}
cnt[i]=f;
}
}
int main()
{
int T;
scanf("%d",&T);
char c[5];
int x,y;
init();
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
memset(ans,0,sizeof(ans));
dp[0]=1;
while(m--)
{
scanf("%s%d%d",&c,&x,&y);
x--,y--;
if(c[0]=='+')
{
for(int i=(1<1<1<if(i&(1<1<2==0)
{
dp[i]=(dp[i]+dp[i-(1<1<1<1<else
{
for(int i=(1<1<1<if(i&(1<1<2==0)
{
dp[i]=(dp[i]-dp[i-(1<1<1<1<for(int i=2;i<=n;i+=2)
{
if(i>2)printf(" ");
printf("%lld",ans[i]);
}
printf("
");
}
}
return 0;
}