1. 程式人生 > >NOI:1996 登山

NOI:1996 登山


題解:動態規劃,兩段最長上升序列,0-k以k結尾的最長上升序列和k-n以k為起點的上升序列兩端和最大

         掌握最長上升子序列的求法,即以ak為終點的最長上升子序列

注意:題目中說一旦下山就不能再上山,所以要分成上山和下山兩部分

#include <stdio.h>
#include <iostream>
#include <iterator>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
int a[1005],b[1005],c[1005];
int n;
int set(int position)//最長上升子序列的求法,以position為終點的最長上升子序列
{
    if(b[position]!=0)return b[position];
    int tmp=0;
    for(int i=0;i<position;i++){
        if(a[i]<a[position]){
            tmp=max(tmp,set(i));
        }
    }
    if(tmp==0){
        b[position]=1;
        return 1;
    }else{
        b[position]=tmp+1;
        return tmp+1;
    }
}
int set2(int position)//反過來的最長上升子序列,從k-n的最長上升子序列 { if(c[position]!=0)return c[position]; int tmp=0; for(int i=position+1;i<n;i++){ if(a[i]<a[position]){ tmp=max(tmp,set2(i)); } } if(tmp==0){ c[position]=1; return 1; }else{ c[position]=tmp+1; return tmp+1; } } int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; b[i]=0; c[i]=0; } int tmp=0; for(int i=0;i<n;i++){ tmp=max(tmp,set(i)+set2(i)-1);//兩段 } cout<<tmp<<endl; }

相關推薦

NOI1996 登山

題解:動態規劃,兩段最長上升序列,0-k以k結尾的最長上升序列和k-n以k為起點的上升序列兩端和最大         掌握最長上升子序列的求法,即以ak為終點的最長上升子序列注意:題目中說一旦下山就不能再上山,所以要分成上山和下山兩部分#include <stdio.h

NOI 2.6 動態規劃 1996:登山

題目來源:http://noi.openjudge.cn/ch0206/1996/1996:登山總時間限制: 5000ms   記憶體限制: 131072kB描述五一到了,PKU-ACM隊組織大家去登山觀光,隊員們發現山上一個有N個景點,並且決定按照順序來瀏覽這些景點,即每次

NOI2806 二分法求函式的零點

題目連結題解:二分法注意:double判斷大小應該用差值小於某個數來進行判斷#include <stdio.h> #include <iostream> #include <cmath> using namespace std; doubl

機試NOI基本演算法

NOI 1.11-2.5 基本演算法學習,不斷更新ing1.11 程式設計基礎之二分查詢二分查詢基本思想:設定左範圍和右範圍,當查詢的數小於中點時,右範圍更新為中點;當大於時,左範圍更新為中點。以此類推,直到左-右==-1或者與中點値相等退出1.13 程式設計基礎之綜合應用這

NOI7621 硬幣面值組合

題解:簡單列舉注意:排序;         格式化輸出 printf("%03d",i);格式化3位,不足補0#include <stdio.h> #include <iostream> #include <string> #include

NOI1712 數值轉換

解題思路:以10進製為中間轉換,無論什麼進位制都轉換成10進位制,然後由十進位制進行轉換注意:當輸入0時的輸出應該也為0         得到b進位制時按照輾轉相除的方法,從後往前輸出,順序注意         輸入的字串注意小寫和大寫的處理#include <stdi

NOI2704 尋找平面上的極大點

題目連結:http://noi.openjudge.cn/ch0406/2704/題意:根據提示,只有位於單獨顏色上的點或者說只有右上角的點才是極大點,所以我對每一個點與x和y軸組成的矩形進行標記,將其中每個點的標記值++,最後只有標記值為1的點,才是我們要找的點#inclu

1996:登山(2.6基本演算法之動態規劃)

1996:登山 總時間限制: 5000ms 記憶體限制: 131072kB 描述 五一到了,PKU-ACM隊組織大家去登山觀光,隊員們發現山上一個有N個景點,並且決定按照順序來瀏覽這些景點,即每次所瀏覽景點的編號都要大於前一個瀏覽景點的編號。同時隊員們還有

NOI8186 判斷元素是否存在

題目連結:http://noi.openjudge.cn/ch0113/41/41:判斷元素是否存在總時間限制: 1000ms 記憶體限制: 65536kB 描述 有一個集合M是這樣生成的: (1) 已知 k 是集合 M 的元素; (2) 如果 y 是 M 的元素,那麼, 2

NOI7213 垃圾炸彈

總時間限制: 1000ms 記憶體限制: 65536kB描述    2014年巴西世界盃(2014 FIFA World Cup)開踢啦!為了方便球迷觀看比賽,里約街道上很多路口都放置了的直播大螢幕,但是人群散去後總會在這些路口留下一堆垃圾。為此巴西政府決定動用一種最新發明—

NOI7062 區間合併

轉載:https://blog.csdn.net/loi_black/article/details/52874488題目:http://noi.openjudge.cn/ch0204/7620/Description 給定 n 個閉區間 [ai; bi],其中i=1,2,…

1996:登山 題解

總時間限制: 5000ms 記憶體限制: 131072kB 描述 五一到了,PKU-ACM隊組織大家去登山觀光,隊員們發現山上一個有N個景點,並且決定按照順序來瀏覽這些景點,即每次所瀏覽景點的編號

NOI2722 和數

題解:簡單題,列舉,列舉兩數之和是否存在即可#include <stdio.h> #include <iostream> #include <vector> #include <set> using namespace std;

解題NOI 1999 生日蛋糕

min aps inline 當當 這一 lose tps ace color 題面 裸的搜索題,就說剪枝(註:nw->noww->當前,res->rest->剩余): 1.想達到$Nπ$的體積,那麽半徑一開始最多也就$sqrt(n)$了,再大就超了

noi題庫1.8程式設計基礎之多維陣列題解大禮包20180918

題目傳送門 以下是對noi題庫1.8的全部題解,有需要的同學請自行學習。 有任何錯漏或者疑問,請留言。謝謝~~~ 1、題目分析 2、程式碼截圖 1.8程式設計基礎之多為陣列 編號 題目 相對難度1-5 知識點 1 矩陣交換行 2

NOI模擬必去之

題解: fi=max⁡j{min⁡{ai−aj,bi−bj}+fj+1}(j&lt;i,pj&lt;i)f_i = \max_j \{\min \{a_i-a_j,b_i-b_j\}+f_j+1\} (j \lt i, p_j \lt i)fi

解題NOI 2016 優秀的拆分

題面 其實題目不算很難,但是我除錯的時候被玄學了,for迴圈裡不寫空格會RE,寫了才能過。神**調了一個多小時是這麼個不知道是什麼的玩意(真事,可以問i207M=。=),心態爆炸 發現我們只要找AA或者BB就行了,因為另一半反過來再做一次然後拼起來就可以了,那麼就設$stp[i]$表示從$i$開始有多少個

【OpenjudgeNoi】7891:一元三次方程求解 c++

【Openjudge:Noi】7891:一元三次方程求解 總時間限制:  1000ms 記憶體限制:  65536kB 描述 有形如:ax3+bx2+cx+d=0  這樣的一個一元三次方程。 給出該方程中各項的係數(a,b,c,d  均為實數),並約定該方程

百練noi 16矩陣剪刀石頭布

16:矩陣剪刀石頭布 檢視提交統計提問 總時間限制: 5000ms 記憶體限制: 65536kB 描述 Bart的妹妹Lisa在一個二維矩陣上創造了新的文明。矩陣上每個位置被三種生命形式

解題NOI 2009 管道取珠

題面 考慮這個平方的實際意義,實際是說取兩次取出一樣的序列 那麼設$dp[i][j][k][h]$表示第一次在上面取$i$個下面取$j$個,第二次在上面取$k$個下面取$h$個的方案數 等等$n^4$根本開不下+過不去啊=。= 發現$i,j,k$固定時$h$可以算出來,於是少一個$n$的複雜度 建議