大佬求助

P1464 Function

@[CE_TAP](/user/1055118) f数组开大点
by rnf5114 @ 2023-11-17 20:03:01


@[CE_TAP](/user/1055118) 您的w函数里,第二个if应该放在第一个if之前。因为如果a,b,c三个数中有任何一个小于0,都会导致你访问到了f数组的负数下标。
by OldVagrant @ 2023-11-17 20:14:54


@[CE_TAP](/user/1055118) 1.你的代码中: ```cpp if(f[a][b][c]) return f[a][b][c]; if(a<=0 || b<=0 || c<=0) return 1 ``` 但是值为负的数组下标会造成越界,导致了re 此处应将两行调换位置 2.这样改完后只有60分(WA on 5,7):注意题面中 - 如果 $a \le 0$ 或 $b \le 0$ 或 $c \le 0$ 就返回值$ 1$。 - 如果 $a>20$ 或 $b>20$ 或 $c>20$ 就返回 $w(20,20,20)$ 但是你现在main()中先判了第二条再去w()中判第一条,所以WA了 AC code: ```cpp #include<iostream> using namespace std; #define int long long int f[55][55][55]; int w(int a,int b,int c){ if(a<=0 || b<=0 || c<=0) return 1; if(a>20 || b>20 ||c>20) a=b=c=20; if(f[a][b][c]) return f[a][b][c]; //if(a<=0 || b<=0 || c<=0) return 1; if(a< b && b<c) return f[a][b][c]= w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c); return f[a][b][c]= w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1); } signed main(){ int a=0,b=0,c=0; while(cin>>a>>b>>c){ if(a==-1 && b==-1 && c==-1){ return 0;} printf("w(%lld, %lld, %lld) = ",a,b,c); //if(a>20 || b>20 ||c>20) a=b=c=20; printf("%lld\n",w(a,b,c)); a=b=c=0; } return 0; } ```
by dontwannacry @ 2023-11-17 20:18:35


@[dontwannacry](/user/564225) @[OldVagrant](/user/438168) @[rnfmabj5114](/user/917683) 感谢各位大佬
by CE_TAP @ 2023-11-17 20:24:33


|