子问题:
对于序列1到n
其子问题设为i到n的最大长度
网上很多是从头开始正推,我想的是从尾部开始测试长度分别为1,2,3。。。n的最大长度,原理一样
代码:
#include <iostream>
#include <string>
#include <vector>
struct node
{
int value;
int num;
};
int main()
{
using namespace std;
int n = 0;
vector<node> li;
int count = 0;
while( true )
{
while( 1 )
{
cin>>n;
if( n == -1 )
break;
node t ={ n,-1};
li.push_back(t);
}
int len = li.size();
count ++;
li[len-1].num = 1;
int i;
for( i = len-2; i >= 0; i-- )
{
int tvalue = li[i].value;
int mnum = 0;
for( int j = i+1; j < len; j++ )
{
if( li[j].value <= tvalue && li[j].num >= mnum )
{
mnum = li[j].num;
}
}
li[i].num = mnum+1;
}
int max = 0;
for( i = 0; i < len; i++ )
{
if( li[i].num > max )
max = li[i].num;
}
li.clear();
cout<<"Test #"<<count<<":"<<"\n"<<" "<<"maximum possible interceptions: "<<max<<endl;
cout<<endl;
int t2;
cin>>t2;
if(t2==-1)
break;
node nt ={ t2,-1};
li.push_back(nt);
}
return 0;
}