问题描述
试题编号: | 201312-4 |
试题名称: | 有趣的数 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 我们把一个数称为有趣的,当且仅当: 输入格式 输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 1000)。 输出格式 输出只有一行,包括恰好n 位的整数中有趣的数的个数除以1000000007的余数。 样例输入 4 样例输出 3 |
今天做了一下2013年12月份的CSP考试试题。
上面这道题采用了深度优先搜索来做,拿了20分,超时了,这也在意料当中。因此我觉得可以考虑将此题改写成动态规划的写法,不过目前还不是很清楚怎么改,总之每天想一下点吧,看这周能不能改写成功。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int h[4];
int n;
int cnt;
void DFS(int i)//i表示第i位
{
if(i==n+1)
{
if(h[0]&&h[1]&&h[2]&&h[3]) cnt=(cnt+1)%1000000007;
return;
}
int j;
for(j=0;j<=3;j++)
{
if(h[0]>n-3||h[1]>n-3||h[2]>n-3||h[3]>n-3)
{
break;
}
if(j==0&&h[1]>0)//1不能出现在0前面
{
continue;
}
if(j==0&&i==1)
{
continue;
}
if(j==2&&h[3]>0)//3不能出现在2前面
{
continue;
}
h[j]++;
DFS(i+1);
h[j]--;
}
}
int main()
{
int i,j,k;
while(scanf("%d",&n)!=EOF)
{
cnt=0;
memset(h,0,sizeof(h));
DFS(1);
printf("%d\n",cnt);
}
return 0;
}