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 }
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 }