dp递推题2010年吉林省省赛

递推题,思维!!



1456: 逃票的chanming(3)

时间限制: 2 Sec  内存限制: 128 MB
提交: 326  解决: 48
[提交][状态][讨论版]

题目描述

这是一个神奇的国度。
    这个国度一共有N个城市组成,让我们将他们编号为1~N,
    这一天,chanming带着他的第一个月的工资K元来到了城市1。他想到城市N去寻找宝藏。经历了艰难险阻,上刀锅下油山,他终于来到了N市。在这里,他发现了n种宝藏。每一种宝藏有a[i]个。
    Chanming是个有情有义的人,他怎么会忘记自己的小伙伴呢~他决定带着3件宝藏回去向他的三个小伙伴炫耀!他是这样考虑的:
    他要带3件宝藏回去。
    同一种类的宝藏他至多只带1件。
    现在Chanming想知道知道他有多少种不同的方案。

 

输入

题目包含多组数据,你需要处理到文件结束(EOF)
每组数据第一行一个正整数n,表示n种类型(3 <= n <= 3000)
第二行有n个数,表述a[i] (a[i] <= 10000)

 

输出

对于每组数据,输出一个数,表示总共有多少种不同的选择(mod 400823823)

 

样例输入

3
1 2 3

样例输出

6

提示

 

来源

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<math.h>
 4 #include<string.h>
 5 #include<algorithm>
 6 using namespace std;
 7 long long dp[3010][4];
 8 int main()
 9 {
10     int n;
11     while(scanf("%d",&n)!=EOF)
12     {
13         memset(dp,0,sizeof(dp));
14         long long a[3010];
15         for(int i=1;i<=n;i++)
16         {
17             scanf("%lld",&a[i]);
18         }
19         dp[3][3]=(a[1]*a[2]*a[3])%400823823;
20         dp[3][2]=(a[1]*a[2]+a[2]*a[3]+a[1]*a[3])%400823823;
21         dp[3][1]=a[1]+a[2]+a[3];
22         for(int i=4;i<=n;i++)
23         {
24             dp[i][3]=(dp[i-1][3]+dp[i-1][2]*a[i])%400823823;
25             dp[i][2]=(dp[i-1][2]+dp[i-1][1]*a[i])%400823823;
26             dp[i][1]=(dp[i-1][1]+a[i])%400823823;
27             //printf("%lld\n",dp[i][3]);
28         }
29         printf("%lld\n",dp[n][3]);
30     }
31     return 0;
32 }

 


 



 

posted @ 2014-08-05 19:27  skyline-Mayc  阅读(179)  评论(0)    收藏  举报