題目描述
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。
輸入格式
輸入資料為兩行,
第一行為飛彈的數目n(n<=1000)
第二行飛彈依次飛來的高度,所有高度值均為不大於30000的正整數。
輸出格式
輸出只有一行是這套系統最多能攔截的飛彈數和要攔截所有飛彈最少要配備這種飛彈攔截系統的套數。兩個資料之間用乙個空格隔開.
樣例輸入8
389 207 155 300 299 170 158 65
樣例輸出
6 2
解析
第乙個問題很好理解,顯然是求最大非公升子串行。經典的動規模型,f[i]表示前i個飛彈的最長非公升子串行,那麼f[i]就是在保證h[j]>=h[i](非公升)的前提下前i-1個f[j]中最大的f[j]+1。
//最長非公升子串行
for(int i=1;i<=n;i++) f[i]=1;
for(int i=1;i<=n;i++)
for(int j=1;j=h[i])&&(f[j]+1>f[i]) )f[i]=f[j]+1;
第二個問題很容易想到每次求最長非公升子串行,然後把這些元素刪除。再求一次最長非公升子串行,然後把這些元素刪除。如此重複,直到全部刪除。但是這裡區域性最優不是整體最優。
舉個反例:6 1 7 3 2 錯解:6 3 2/1/7 正解:6 1/7 3 2
換個角度考慮 1.所有飛彈都要打下來 2.必須是不嚴格的單調遞減 結論:只要把最長上公升子串行都打下來了,所有飛彈就可以打下來。那麼問題就抽象成了求最長上公升子串行
//最長上公升子串行
for(int i=1;i<=n;i++) f[i]=1;
for(int i=1;i<=n;i++)
for(int j=1;jf[i]) )f[i]=f[j]+1;
下面給出完整的**:#include#includeusing namespace std;
int f[1100],h[1100],n;
void readdata()
}void write()
int main()
NOIP 1999 提高組 複賽 攔截飛彈
noip 1999 提高組 複賽 攔截飛彈 1.該題一看完,馬上確定是動態規劃問題,對應經典模型 最大上公升子串行。2.該題是最大下降子串行。3.最多能攔截幾枚,處理好,但最少幾套系統,卻不清楚,幾次想採用偏分,1,2,未果 4.搜尋介紹得不錯 由於炮彈的發射高度是遞減的,如果後面的飛彈的高度大於前...
NOIP1999 攔截飛彈
時間限制 1 sec 記憶體限制 64 mb 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔...
NOIP1999 攔截飛彈
1044 攔截飛彈 1999年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 檢視執行結果 題目描述 description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但...