2014多校第十场1002 || HDU 4972 A simple dynamic programming problem

题目链接

题意 : 每次无论哪个队投进一个篮球,就记下现在两队比分的差值,问你最后的结果有多少种情况。

思路 : 该题实在是不好理解,最后的结果有多少种情况就是说不管中间过程怎么来的,只要最后结果不一样的情况。因为会有不合法数据,类似于2 2 2 或者是1 5 9 23这种数据,非法数据就是0种情况,但是1 1 1 这种情况是可以的,你赢了1分的球,我下次赢了2分的球,差值还是1 ,由此也推断,整个数列中会产生不同情况的地方只有1 2 或者2 1 这些情况,你赢了1分球,然后你又赢了1分球,差值为2 ,与你赢了1分球我赢了3分球差值还为2 如果最后结果不一样 的话就是两种情况。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <math.h>
 4 #include <iostream>
 5 #define LL long long
 6 
 7 using namespace std ;
 8 int a[100010] ;
 9 
10 int main()
11 {
12     int T,n,casee = 1 ;
13     scanf("%d",&T) ;
14     while(T--)
15     {
16         scanf("%d",&n) ;
17         for(int i = 1 ; i <= n ; i++)
18         {
19             scanf("%d",&a[i]) ;
20         }
21         LL ans = 1 ;
22         bool flag = true ;
23         for(int i = 2 ; i <= n ; i++)
24         {
25             if(fabs(a[i]-a[i-1]) > 3)
26             {
27                 flag = false ;
28                 break ;
29             }
30             if(a[i] == a[i-1] && a[i] != 1)
31             {
32                 flag = false ;
33                 break ;
34             }
35             if(a[i] == 1 && a[i-1] == 2) ans ++ ;
36             if(a[i] == 2 && a[i-1] == 1) ans ++ ;
37         }
38         printf("Case #%d: ",casee++) ;
39         if(!flag)
40         {
41             printf("0
") ;
42             continue;
43         }
44         else if(a[n] == 0)
45         {
46             printf("%I64d
",ans) ;
47             continue ;
48         }
49         printf("%I64d
",ans*2) ;
50     }
51     return 0 ;
52 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3928580.html