首页 > 代码库 > 拦截导弹 (NYOJ—79)

拦截导弹 (NYOJ—79)

这是到动态规划的题目,属于有顺序的0 1 背包问题;

代码:

 1 #include<stdio.h> 2 #include<string.h> 3  4 int d[20][100000];  //d[i][j] 5 int a[20]; 6 int N; 7  8 int max(int a, int b) 9 {10     return a>b?a:b;11 }12 13 int solve(int i,int high)14 {15     if(d[i][high]>=0)16         return d[i][high];17     if(i==N)18     {19         if(a[i]<high)20             return d[N][high]=1;21         else22             return d[N][high]=0;23     }24     if(a[i]<high)25         return d[i][high]=max(solve(i+1,a[i])+1,solve(i+1,high));          //打击和不打击  取大者26     else27         return d[i][high]=solve(i+1,high);28 }29 30 int main()31 {32     int T;33     scanf("%d",&T);34     while(T--)35     {36         memset(d,-1,sizeof(d));37         scanf("%d",&N);38         for(int i=1; i<=N; i++)39         {40             scanf("%d",&a[i]);41         }42         printf("%d\n",solve(0,9999));43     }44     return 0;45 }

但这个代码提交会得到RE,至于为什么可能是记忆话搜索对这个的复杂度减小的比较小,所以递归深度太深,造成堆栈溢出。

我想多了,不是这个原因,是我没有注意到下标越界了。

AC代码:

 1 #include<stdio.h> 2 #include<string.h> 3  4 int d[22][1000];  //d[i][j] 5 int a[22]; 6 int N; 7  8 int max(int a, int b) 9 {10     return a>b?a:b;11 }12 13 int solve(int i,int high)14 {15     if(d[i][high]>=0)16         return d[i][high];17     if(i==N)18     {19         if(a[i]<high)20             return d[N][high]=1;21         else22             return d[N][high]=0;23     }24     if(a[i]<high)25         return d[i][high]=max(solve(i+1,a[i])+1,solve(i+1,high));          //打击和不打击  取大者26     else27         return d[i][high]=solve(i+1,high);28 }29 30 int main()31 {32     int T;33     scanf("%d",&T);34     while(T--)35     {36         memset(d,-1,sizeof(d));37         scanf("%d",&N);38         for(int i=1; i<=N; i++)39         {40             scanf("%d",&a[i]);41         }42         printf("%d\n",solve(1,999));43     }44     return 0;45 }

 

拦截导弹 (NYOJ—79)