算法之动态规划Redraiment的走法

 

 分析和思路:其实就是找到从最左边开始以当前最右边节点结尾的最长递增子序列。注意,最长的子序列不一定包含最后一个节点。这是一个动态规划题。

复制代码

复制代码
 1 #include "iostream"
 2 #include "algorithm"
 3 using namespace std;
 4 
 5 
 6 //解题思路:从数组开始,dp【200】中dp【i】表示从i开始的最长递增序列,返回其中最大值即可
 7 int main()
 8 {
 9     int number=0;
10     int dp[200]={1};
11     for(int i=0;i<200;i++)
12     {
13 
14         dp[i]=1;
15     }
16     while(cin>>number)
17     {
18 
19         int a[200]={0};
20 
21         for(int i=0;i<number;i++){ 
22             int temp=0;
23             cin>>temp;
24             a[i]=temp;
25 
26         }
27 
28 
29 
30 
31     int max_number=0;
32     int res = 1;
33         for(int j=0;j<number;j++)
34         {
35             //for(int j=number;j-1>=0;j--)
36             {
37                 int max1=dp[j];
38                 for(int t=0;t<j;t++)//注意,这里不能是t=i+1;t<number;t++ 啥的,注意理解这个题目的状态转移关系 
39                 {
40 
41                 //    dp[j]=dp[j-1];
42                     if(a[j]>a[t])
43                     {
44                         dp[j]=dp[t];
45 
46                         dp[j]+=1;
47                         if(max1<dp[j])
48                         {
49                             max1=dp[j];
50                         }
51                     }
52                 
53                 }
54                 dp[j]=max1;
55                 res = max(res, dp[j]);//注意,dp[n]不一定就是最大值
56             }
57 
58             // res = max(res, dp[i]);//注意,dp[n]不一定就是最大值
59         }
60             //sort(dp,dp+number);
61         cout<<res<<endl;
62         //    cout<<dp[number-1]<<endl;
63             for(int i=0;i<200;i++)
64         {
65             dp[i]=1;
66         }
67 
68     }
69 
70 
71 }
复制代码

 

 
复制代码

别人可以参考的代码:

复制代码
 1 #include "iostream"
 2 #include "vector"
 3 using namespace std;
 4 int lengthOfLIS(vector<int>& nums)
 5 {
 6     int n = nums.size();
 7     if (n == 0)  return 0;
 8     vector<int> dp(n, 0);
 9     int res = 1;
10     for (int i = 0; i < n; i++)
11     {
12         dp[i] = 1;
13         for (int j =i-1 ; j>=0 ; j--)
14    //     for (int j = 0; j < i; j++)
15         {
16             if (nums[j] < nums[i])
17             {
18                 dp[i] = max(dp[i], dp[j] + 1);
19             }
20         }
21         res = max(res, dp[i]);
22     }
23     return res;
24 }
25 int main()
26 {
27     int number=0;
28    while(cin>>number)
29     {
30 
31         int a[200]={0};
32        vector<int> nums;
33 #if 1
34         for(int i=0;i<number;i++){ 
35             int temp=0;
36             cin>>temp;
37             nums.push_back(temp);
38 
39         }
40 #endif
41        int result=0;
42        result=lengthOfLIS(nums);
43        cout<<result<<endl;
44    }
45            
46     
47 }
复制代码

 

posted @   技术笔记记录  阅读(206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示