POJ 2757 最长上升子序列 解题报告
POJ 2757 最长上升子序列 解题报告
编号:2757
考查点:动态规划
思路:求最优的问题首先要想到用动态规划,想到用动态规划要想到如何找状态转移,这道题肯定是DP,状态转移我倒是想了半天,好不容易搞定了递归+状态量部分,结果忘了从状态量里找到最大的输出了,幸亏及时发现.。
提交情况: 程序递归部分改了N次,后来提交因为没有从状态量里找最大的输出WA了一次,其它都还好.用DP时间和空间效果都还不错.。
Source Code:
//POJ Grids 2757
#include <iostream>
using namespace std;
int num[1024];
int len[1024];
int Search(int i)
{
if (i==1)
return len[1];
else
{
int max = 0;
for (int j=1;j<i;j++)
{
if (!len[j])
len[j] = Search(j);
if (len[j]>max&&num[i]>num[j])
max = len[j];
}
len[i] = max+1;
}
return len[i];
}
int main()
{
int n;
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>num[i];
}
memset(len,0,sizeof len);
len[1] = 1;
Search(n);
int max = 0;
for (int i=1;i<=n;i++)
{
if (len[i]>max)
max = len[i];
}
cout<<max<<endl;
return 0;
}
总结:DP果真很难,我目前还不能一眼就看出状态转移关系,更不用说其它的了,路漫漫..努力!
By Ns517
Time