在家的时候一百个不愿意做事。
到姥姥家反倒写的起劲。。。
我就是嘚瑟。。。
序列型动态规划第一题:
题目:
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入描述:
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数)
输出描述:
输出这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
样例输入:
389 207 155 300 299 170 158 65
样例输出:
6
2
数据范围及提示;
导弹的高度<=30000,导弹个数<=20
我的答案:
感觉序列型和背包型的区别并没有我想的那么大。
本质上还是动态规划。
用填表就能解决。
这道题用dp+贪心来解决就够了。
特别鬼畜的是这道题的输入,顺便学了一波freopen
freopen("in.txt","r",stdin); r代表读文件,stdin是输入
用dev时要将输入重定向到文件,否则会在while那里循环等待,所以要用文件。
提交的时候不用因为网站上面会自动重定向。
这句话在网站上提交的时候注释掉都不行,他会自动检测到你的代码含有freopen,就算是注释他都会查到。
所以要删掉。
不知道贪心用在第二问上是不是严谨。不过每次AC了之后我就不想再想了。。。
代码:
#include <iostream>
using namespace std;
int missile[21]; //导弹高度
int dp[21]; //dp[i]打到第i颗,最大颗数
int flag[21];
void downdp(int n)
{
int i=0,j=0;
int sum=0;
for(i=0;i<=n;i++)
{
dp[i]=1;
}
for(i=0;i<=n;i++)
{
for(j=0;j<i;j++)
{
if(missile[j]>=missile[i])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
}
for(i=0;i<=n;i++)
{
if(sum<dp[i]) sum=dp[i];
}
cout<<sum;
}
void sysnum(int n)
{
int i=0,j=0;
int limit=30000;
int sum=0;
for(i=0;i<=n;i++)
{
if(flag[i]==0)
{
flag[i]=1;
sum++;
limit=missile[i];
for(j=i+1;j<=n;j++)
{
if(missile[j]<=limit && flag[j]==0)
{
flag[j]=1;
limit=missile[j];
int i==0;
}
}
}
}
cout<<sum<<endl;
}
int main()
{
int i=-1;
int sum=0; //导弹总数
freopen("in.txt","r",stdin); //神奇输入
while(cin>>missile[++i])
sum=i;
downdp(sum); //输出1:降序最大值
cout<<endl;
sysnum(sum); //输出2:系统数
return 0;
}
序列型动态规划第一题:
题目:
给一个数组a1, a2 ... an,找到最长的上升降子序列ab1<ab2< .. <abk,其中b1<b2<..bk。
输出长度即可。
输入描述:
第一行,一个整数N。
第二行 ,N个整数(N < = 5000)
输出描述:
输出K的极大值,即最长不下降子序列的长度
样例输入:
5
9 3 6 2 7
样例输出:
3
数据范围及提示:
【样例解释】
最长不下降子序列为3,6,7
我的答案:
是上题的一部分。
emmm题目描述的乱七八糟。应该不是上升降,是不下降。。。
代码如下吧,我叨叨不动了。。。
#include <iostream>
using namespace std;
int arr[5001]; //序列
int dp[5001];
void notdowndp(int n)
{
int i=0,j=0;
int sum=0;
for(i=0;i<n;i++)
{
dp[i]=1;
}
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(arr[j]<=arr[i])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
}
for(i=0;i<n;i++)
{
if(sum<dp[i]) sum=dp[i];
}
cout<<sum;
}
int main()
{
int n=0,i=0;
cin>>n;
for(i=0;i<n;i++) cin>>arr[i];
notdowndp(n);
return 0;
}
序列型动态规划还有一道线段覆盖。。。
看见线段覆盖头疼。。。
16:30了,也该吃饭了,就酱吧~
这个假期至少要升钻石鸭~
加油~