算法优化(题目有点长,希望有兴趣的可以看下去)
题目如下:下学期一共有n次考试,考试科目有4种,分别为理科(物理化学生物)、文科(历史地理艺术)、必修(语文数学英语)和综合。每次考哪一科是不定的,因此在考试前Jace不知道应该去复习哪一科的功课。Jace希望能预测出下一次可能考的科目。于是,Jace收集到了以往的考试的资料。从以往的考试中,他发现了这样几个规律:
1.如果这次考的是理科,那么下一次一定会考文科;
2.如果这次考的是综合,那么下一次一定会考必修;
3.如果这次考的是文科,那么下一次要么考理科,要么考必修;
4.如果这次考的是必修,那么下一次要么考文科,要么考综合。
Jace已经知道,本学期的第一次考试科目为理科。他打算拟定一个可以应对所有可能情况的应考复习计划。因此,他想知道,整个学期有多少种可能的考试科目安排满足以上规律。
要求:
输入
一个正整数n,代表本学期总的考试次数。
输出
一个正整数,表示符合规律的科目安排方案的总数。考虑到这个结果可能会很大,因此你只需要输出它mod 7654321的值即可。
测试实例:
输入示例
5
输出示例
5
其他说明:
当n=5时,有以下5种方案满足要求:
理科-->文科-->理科-->文科-->理科
理科-->文科-->理科-->文科-->必修
理科-->文科-->必修-->文科-->理科
理科-->文科-->必修-->文科-->必修
理科-->文科-->必修-->综合-->必修
对于50%的数据,1≤n≤10.
对于60%的数据,1≤n≤20.
对于80%的数据,1≤n≤1000.
对于100%的数据,1≤n≤10000.
(没有n=10000这个数据哦)
注意事项:
运行时间限制:1000ms
希望各位大神给与解答:
本人也写了一个程序但是当n>50的时候就基本上要超时间了,
所以希望各位大神帮忙。提高运行效率
我的程序如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{
int s;
struct stack * next[2];
} Stack,* PStack;
struct exam {
int x;
int y;
};
PStack data[4];
int n;
long total=0;
struct exam a[10000];
void run(int k);
int main(void)
{
int i,j;
for (i=0;i<4;i++){
data[i]=(PStack)malloc(sizeof(Stack));
data[i]->s=i;
}
data[0]->next[0]=data[1];
data[0]->next[1]=NULL;
data[1]->next[0]=data[0];
data[1]->next[1]=data[2];
data[2]->next[0]=data[1];
data[2]->next[1]=data[3];
data[3]->next[0]=data[3];
data[3]->next[1]=NULL;
total=0;
a[0].x=0;
a[1].x=1;
scanf("%d",&n);
if (n<=2) {
total=1;
printf("%d\n",total);
return 0;
}
for (i=2;i<n;i++){
a[i].x=data[a[i-1].x]->next[0]->s;
}
total++;
i=n-2;
while(i>=1)
{
if (data[a[i].x]->next[1] == NULL || a[i].y==1)
{
i--;
}
else
{
a[i].y=1;
for (j=i+1;j<n;j++)
{
a[j].x=data[a[j-1].x]->next[a[j-1].y]->s;
a[j].y=0;
}
total++;
i=n-2;
}
}
printf("%ld\n",total%7654321);
return 0;
}