题目描述
Redraiment是走梅花桩的高手。Redraiment可以选择任意一个起点,从前到后,但只能从低处往高处的桩子走。他希望走的步数最多,你能替Redraiment研究他最多走的步数吗?
参考leetcode最长递增子序列
动态规划:dp数组保存每部最优解
dp[i]=max(dp[i],dp[j]+1) 且j属于[0,i)
class Solution { public: int lengthOfLIS(vector<int>& nums) { vector<int> dp(nums.size(),1); int ans=1; for(int i=0;i<nums.size();i++) { for(int j=0;j<i;j++) { if(nums[j]<nums[i]) { dp[i]=max(dp[i],dp[j]+1); if(dp[i]>ans) ans=dp[i]; } } } return ans; } };
所以加上输入输出后:
#include<iostream> using namespace std; int max(int a,int b){ return a>b?a:b; } int main(){ int num; while(cin>>num){ int input[num]; for(int i=0;i<num;i++) cin>>input[i]; int dp[num];int ans=1; for(int i=0;i<num;i++) { dp[i]=1; for(int j=0;j<i;j++) { if(input[j]<input[i]) { dp[i]=max(dp[j]+1,dp[i]); if(dp[i]>ans) ans=dp[i]; } } } cout<<ans<<endl; } }