hdu 4972 A simple dynamic programming problem (每次记录两队得分差值求结果数)
因为是每次投篮后记录两队得分的差值,所以两个队伍的总分是不断增加的,可以发现只有差值由1-->2或者2-->1的情况才可能产生产生两种总分和的结果如 0:2可以变成2:3和1:2 其他的情况都只能是一种
郜大可的代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 #define LL __int64 7 #define Ma 100010 8 int num[Ma]; 9 int main(){ 10 int t,cas=1; 11 scanf("%d",&t); 12 while(t--){ 13 int n,ans=2; 14 scanf("%d",&n); 15 for(int i=0;i<n;i++) 16 scanf("%d",&num[i]); 17 if(num[0]>3||num[0]==0){ 18 ans=0; 19 goto sss; 20 } 21 for(int i=1;i<n;i++){ 22 int k=abs(num[i]-num[i-1]); 23 if(k>3||(num[i]!=1&&num[i-1]==num[i])){ 24 ans=0; 25 goto sss; 26 } 27 if((num[i-1]==1&&num[i]==2)||(num[i-1]==2&&num[i]==1)){ 28 ans+=2; 29 } 30 } 31 if(num[n-1]==0) ans/=2; 32 sss:printf("Case #%d: %d\n",cas++,ans); 33 } 34 return 0; 35 } 36 37 38 [ Copy to Clipboard ] [ Save to File]