主题:TJU1004 防御导弹的问题
Problem
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在使用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
Input
最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数)
Output
两个整数M和N。表示:这套系统最多能拦截 M 枚导弹,如果要拦截所有导弹最少要配备 N 套这种导弹系统。
小弟刚刚开始编程上路. 对这DP的经典题目很感兴趣.
下面是网上一朋友给我他自己的程序, 但还是没看懂里面的东西.
谁能给我讲讲程序中定义的3个数组分别在程序中有什么作用.还有这程序运行的大概过程.
程序清单
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[20],b[20],h[20];
int n=0;
int m=0,k=0;
while(scanf("%d",&a[n])==1)
{
b[n]=0;
int i=0;
for(;i<n;i++)
{
if(a[i]>a[n]&&b[i]>b[n])
b[n]=b[i];
}
b[n]++;
if(b[n]>m)
m=b[n];
int flag=0;
int j=0;
for(;j<k;j++)
{
if(h[j]>a[n])
{
h[j]=a[n];
flag=1;
break;
}
}
if(flag==0)
{
k++;
h[j]=a[n];
}
n++;
}
printf("%d %d\n",m,k);
return 0;
}
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在使用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
Input
最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数)
Output
两个整数M和N。表示:这套系统最多能拦截 M 枚导弹,如果要拦截所有导弹最少要配备 N 套这种导弹系统。
小弟刚刚开始编程上路. 对这DP的经典题目很感兴趣.
下面是网上一朋友给我他自己的程序, 但还是没看懂里面的东西.
谁能给我讲讲程序中定义的3个数组分别在程序中有什么作用.还有这程序运行的大概过程.
程序清单
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[20],b[20],h[20];
int n=0;
int m=0,k=0;
while(scanf("%d",&a[n])==1)
{
b[n]=0;
int i=0;
for(;i<n;i++)
{
if(a[i]>a[n]&&b[i]>b[n])
b[n]=b[i];
}
b[n]++;
if(b[n]>m)
m=b[n];
int flag=0;
int j=0;
for(;j<k;j++)
{
if(h[j]>a[n])
{
h[j]=a[n];
flag=1;
break;
}
}
if(flag==0)
{
k++;
h[j]=a[n];
}
n++;
}
printf("%d %d\n",m,k);
return 0;
}