TLE求看

P1464 Function

@[IaLWH](/user/486727) 你这个要用记忆化,单纯去递归会超时。我给你写一下代码
by zhuyucheng6046 @ 2024-08-07 16:01:55


@[zhuyucheng6046](/user/1312199) 我只是想知道为什么样例都会超时
by IaLWH @ 2024-08-07 16:03:48


你用 scanf 输入 long long 不应该用 %lld 吗?
by Gcc_Gdb_7_8_1 @ 2024-08-07 16:06:39


改完后就 AC 样例了
by Gcc_Gdb_7_8_1 @ 2024-08-07 16:07:55


@[IaLWH](/user/486727) 单纯递归会有许多重复计算,才会TLE; 用记忆化呢减少计算量
by xujiacheng0312 @ 2024-08-07 16:08:21


要不要 AC Code?
by Gcc_Gdb_7_8_1 @ 2024-08-07 16:11:39


@[IaLWH](/user/486727) ?
by Gcc_Gdb_7_8_1 @ 2024-08-07 16:12:57


```cpp #include<cstdio> #define int long long int f[25][25][25]; int w(int a,int b,int c){ if(a<=0||b<=0||c<=0) return 1; if(a>20||b>20||c>20) return (f[20][20][20]?f[20][20][20]:f[20][20][20]=w(20,20,20)); if(!f[a-1][b][c]) f[a-1][b][c]=w(a-1,b,c); if(!f[a-1][b-1][c]) f[a-1][b-1][c]=w(a-1,b-1,c); if(!f[a-1][b][c-1]) f[a-1][b][c-1]=w(a-1,b,c-1); if(!f[a-1][b-1][c-1]) f[a-1][b-1][c-1]=w(a-1,b-1,c-1); return f[a-1][b][c]+f[a-1][b-1][c]+f[a-1][b][c-1]-f[a-1][b-1][c-1]; } signed main(){ int i,a=0,b=0,c=0; f[0][0][0]=1; scanf("%lld%lld%lld",&a,&b,&c); for(i=0;a!=-1||b!=-1||c!=-1;i++){ printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,w(a,b,c)); scanf("%lld%lld%lld",&a,&b,&c); } return 0; } ``` 没开记忆化肯定炸 输入也有问题,是%lld而不是%d
by GrainRain25 @ 2024-08-07 16:15:57


@[GrainRain25](/user/592897) 对
by Gcc_Gdb_7_8_1 @ 2024-08-07 16:16:53


```cpp #include<bits/stdc++.h> using namespace std; long long f[25][25][25]; long long p(long long a,long long b,long long c) { if(a<=0||b<=0||c<=0) return 1; else if(a>20||b>20||c>20) return p(20,20,20); else if(f[a][b][c]!=0) return f[a][b][c]; else if(a<b&&b<c) f[a][b][c]=p(a,b,c-1)+p(a,b-1,c-1)-p(a,b-1,c); else f[a][b][c]=p(a-1,b,c)+p(a-1,b-1,c)+p(a-1,b,c-1)-p(a-1,b-1,c-1); return f[a][b][c]; } int main() { while(1) {long long q,w,e; scanf("%lld %lld %lld",&q,&w,&e); //cout<<q<<" "<<w<<" "<<e<<endl; if((q==-1)&&(w==-1)&&(e==-1)) break; printf("w(%lld, %lld, %lld) = %d\n", q,w,e, p(q,w,e)); } return 0; } ```
by zhuyucheng6046 @ 2024-08-07 16:18:22


| 下一页