Description
Input
第一行包含一个正整数n,队伍的个数。第二行包含n个非负整数,即每支队伍的得分。
Output
输出仅一行,即可能的分数表数目。保证至少存在一个可能的分数表。
Sample Input
6
5 6 7 7 8 8
Sample Output
121
HINT
N<=8
搜索,剪枝
时间压的真紧……
10028 ms也算过了
#include <iostream>
#include <cstdio>
#define For(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
int n,a[9],b[9],ans,sco[]={3,1,0,0};
void dfs(int x,int y)
{
if(b[x]>a[x])
return;
if((b[x]+3*(n-y+1))<a[x])
return;
if(x==n)
{
ans++;
return;
}
if(y==n)
{
int t=a[x]-b[x];
if(t==2)
return;
b[y]+=sco[t];
dfs(x+1,x+2);
b[y]-=sco[t];
}
else
{
b[x]+=3;dfs(x,y+1);b[x]-=3;
b[y]+=3;dfs(x,y+1);b[y]-=3;
b[x]++;b[y]++;dfs(x,y+1);b[x]--;b[y]--;
}
}
int main()
{
scanf("%d",&n);
For(i,1,n)
scanf("%d",&a[i]);
dfs(1,2);
printf("%d",ans);
return 0;
}