这是到动态规划的题目,属于有顺序的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 else 22 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 else 27 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 else 22 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 else 27 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 }
时间: 2024-10-29 19:11:41