問題描述
試題編號: | 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;
}