代码改变世界

1280. Permutation

2011-05-15 16:09  Min·zc  阅读(258)  评论(0编辑  收藏  举报
 1 /*搜索超时,但是不知道进行一些剪枝会不会过了
 2  *后来看了别人的思路DP
 3  *这个DP真的挺牛逼的
 4  *移步这里http://blog.csdn.net/Rappy/archive/2007/09/23/1797699.aspx
 5  *传送门http://soj.me/1280
 6  */
 7 
 8 #include <iostream>
 9 #include <memory.h>
10 using namespace std;
11 int n;
12 int A[110];
13 int B[110];
14 int S[110][110];
15 int work()
16 {
17         memset(S,0,sizeof(S));
18         for(int i=0;i<n;i++)
19                 cin>>A[i];
20         for(int i=1;i<=n;i++)
21                 B[i]=A[i-1]>A[i]?0:1;
22         S[0][0]=1;
23         for(int i=1;i<n;i++)
24                 for(int j=0;j<=i;j++)
25                         if(B[i]==1)
26                                 for(int k=j+1;k<=i;k++)
27                                         S[i][k]+=S[i-1][j];
28                         else
29                                 for(int k=j;k>=0;k--)
30                                         S[i][k]+=S[i-1][j];
31         int ans=0;
32         for(int i=0;i<=n;i++)
33                 ans+=S[n-1][i];
34         return ans;
35 }
36 int main()
37 {
38         cin>>n;
39         while(n!=0)
40         {
41                 cout<<work()<<endl;
42                 cin>>n;
43         }
44 }