1
/*
搜索超时,但是不知道进行一些剪枝会不会过了
2
*后来看了别人的思路DP
3
*这个DP真的挺牛逼的
4
*移步这里http://blog.youkuaiyun.com/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 }
转载于:https://www.cnblogs.com/congzc/archive/2011/05/15/2329966.html