导弹拦截问题
导弹拦截问题(也称为最长不上升子序列问题)是动态规划中的经典问题之一。问题的描述如下:
给定一个导弹飞行高度的序列,要求拦截所有导弹。拦截系统有一个限制:每次拦截的导弹高度不
能高于前一次拦截的导弹高度。问最少需要多少套拦截系统才能拦截所有导弹,或者一套拦截系统最多能拦截多少导弹。
这个问题可以转化为两个子问题:
1. 最少需要多少套拦截系统:即求导弹高度序列的最长上升子序列(LIS)的长度。
2. 一套拦截系统最多能拦截多少导弹:即求导弹高度序列的最长不上升子序列(LNIS)的长度。
示例数据:{189, 207, 155, 200, 99}
导弹拦截问题
给定一个导弹飞行高度的序列,要求拦截所有导弹。拦截系统有一个限制:每次拦截的导弹高度不
能高于前一次拦截的导弹高度。问最少需要多少套拦截系统才能拦截所有导弹,或者一套拦截系统最多能拦截多少导弹。
这个问题可以转化为两个子问题:
1. 最少需要多少套拦截系统:即求导弹高度序列的最长上升子序列(LIS)的长度。
2. 一套拦截系统最多能拦截多少导弹:即求导弹高度序列的最长不上升子序列(LNIS)的长度。
示例数据:{189, 207, 155, 200, 99}
#include<iostream> #include<cstdio> #include<algorithm> #include<vector> using namespace std; int maxMissiles(vector<int>&heights){ int n=heights.size(); vector<int>dp(n,1); for(int i=1;i<n;i++){ for(int j=0;j<i;j++){ if(heights[j]>=heights[i]){ dp[i]=max(dp[j]+1,dp[i]); } } } return *max_element(dp.begin(),dp.end()); } int maxSystem(vector<int>&heights){ int n=heights.size(); vector<int>dp(n,1); for(int i=1;i<n;i++){ for(int j=0;j<i;j++){ if(heights[j]<=heights[i]){ dp[i]=max(dp[j]+1,dp[i]); } } } return *max_element(dp.begin(),dp.end()); } int main(){ vector<int> heights={189,207,155,300,99}; int n=maxMissiles(heights); cout<<n<<endl; n=maxSystem(heights); cout<<n; return 0; }
/*
导弹拦截问题(也称为最长不上升子序列问题)是动态规划中的经典问题之一。问题的描述如下:
给定一个导弹飞行高度的序列,要求拦截所有导弹。拦截系统有一个限制:每次拦截的导弹高度不
能高于前一次拦截的导弹高度。问最少需要多少套拦截系统才能拦截所有导弹,或者一套拦截系统最多能拦截多少导弹。
这个问题可以转化为两个子问题:
1. 最少需要多少套拦截系统:即求导弹高度序列的最长上升子序列(LIS)的长度。
2. 一套拦截系统最多能拦截多少导弹:即求导弹高度序列的最长不上升子序列(LNIS)的长度。
示例数据:{189, 207, 155, 200, 99}
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int maxMissiles(vector<int>&heights){
int n=heights.size();
vector<int>dp(n,1);
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(heights[j]>=heights[i]){
dp[i]=max(dp[j]+1,dp[i]);
}
}
}
return *max_element(dp.begin(),dp.end());
}
int maxSystem(vector<int>&heights){
int n=heights.size();
vector<int>dp(n,1);
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(heights[j]<=heights[i]){
dp[i]=max(dp[j]+1,dp[i]);
}
}
}
return *max_element(dp.begin(),dp.end());
}
int main(){
vector<int> heights={189,207,155,300,99};
int n=maxMissiles(heights);
cout<<n<<endl;
n=maxSystem(heights);
cout<<n;
return 0;
}
导弹拦截问题(也称为最长不上升子序列问题)是动态规划中的经典问题之一。问题的描述如下:
给定一个导弹飞行高度的序列,要求拦截所有导弹。拦截系统有一个限制:每次拦截的导弹高度不
能高于前一次拦截的导弹高度。问最少需要多少套拦截系统才能拦截所有导弹,或者一套拦截系统最多能拦截多少导弹。
这个问题可以转化为两个子问题:
1. 最少需要多少套拦截系统:即求导弹高度序列的最长上升子序列(LIS)的长度。
2. 一套拦截系统最多能拦截多少导弹:即求导弹高度序列的最长不上升子序列(LNIS)的长度。
示例数据:{189, 207, 155, 200, 99}
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int maxMissiles(vector<int>&heights){
int n=heights.size();
vector<int>dp(n,1);
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(heights[j]>=heights[i]){
dp[i]=max(dp[j]+1,dp[i]);
}
}
}
return *max_element(dp.begin(),dp.end());
}
int maxSystem(vector<int>&heights){
int n=heights.size();
vector<int>dp(n,1);
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(heights[j]<=heights[i]){
dp[i]=max(dp[j]+1,dp[i]);
}
}
}
return *max_element(dp.begin(),dp.end());
}
int main(){
vector<int> heights={189,207,155,300,99};
int n=maxMissiles(heights);
cout<<n<<endl;
n=maxSystem(heights);
cout<<n;
return 0;
}

浙公网安备 33010602011771号