题目描述
某农场有一个由按编号排列的 n 根木桩构成的首尾不相连的围栏。现要在这个围栏中选取一些木桩,按照原有的编号次序排列之后,这些木桩高度成一个升序序列。所谓的升序序列就是序列中的任何一个数都不小于它之前的任何一个数。试编写程序从这个围栏中选取合适的木桩使得选出的木桩个数 t 最大,并求出选取出 t 根木桩的方案总数 c。
输入格式
文件中的第一行只有一个数 m,表明随后有 m 个问题的描述信息。每个问题的描述信息格式为 i,ℎ1,ℎ2,ℎ3,…,ℎi,n,h1,h2,h3,…,hn(其中 ℎi(i=1,2,3,…,i)hi(i=1,2,3,…,n) 表示第 i 根木桩的高度)。
输出格式
依次输出每个问题中 t 和 c 的解。每行输出一个问题的解。
#include <bits/stdc++.h>
using namespace std;
int arr[1005];
int n,m,ans,sum;
void dfs(int t,int site)
{
if(site>ans){
ans=site;
sum=0;
}
if(site==ans){
sum++;
}
for(int i=t+1;i<m;i++){
if(arr[i]>=arr[t]){
dfs(i,site+1);
}
}
}
int main()
{
cin>>n;
while(n--){
cin>>m;
ans=0;
sum=0;
for(int i=0;i<m;i++){
cin>>arr[i];
}
for(int i=0;i<m;i++){
dfs(i,1);
}
cout<<ans<<' '<<sum<<endl;
}
return 0;
}