广东营销式网站,网络广告推广,设计网络营销方案,运营的三个核心要素真的好苦逼#xff0c;这道神题#xff0c;交了几十次都是70分#xff0c;剩下的都TLE了#xff0c;崩溃。 没办法#xff0c;只能这样了。在网上看了别人的算法#xff0c;大概思想是把三维的先压成两维#xff0c;再把二维的弄成一维#xff0c;这样就很容易了。 首先… 真的好苦逼这道神题交了几十次都是70分剩下的都TLE了崩溃。 没办法只能这样了。在网上看了别人的算法大概思想是把三维的先压成两维再把二维的弄成一维这样就很容易了。 首先先累计从最底层到第i层的值然后枚举ij把第i层到第j层之间的值的和都算出来就降成了二维然后再去类似的枚举降成简单的一维。 从这道题中学到了 1 输入优化是很重要的。 2 根据题目特点可采取更优的循环方式。 3 max不能滥用最好还是用比较的方式效率比较高。 4 inline应该是有用。 #includecstdio
#includecctype
#includecstring
#define rep(i,j,k) for(int i j; i k; i)
#define maxn 60
using namespace std;int key[maxn][maxn][maxn], f[maxn][maxn] {0}, dp[maxn];
int h, x, y;inline int read() //重要的输入优化
{int s 0, t 1; char c getchar();while( !isdigit(c) ){if( c - ) t -1; c getchar();}while( isdigit(c) ){s s * 10 c - 0; c getchar();}return s * t;
}int maxsum3()
{int ans -0xfffffff;rep(i,1,h){rep(j,i,h){rep(k,1,x){rep(l,1,y){f[k][l] key[j][k][l] - key[i-1][k][l];}}//重要优化所在不要枚举k和l之间的所有值把他们一次性算出来后清零下一次再重算而是采用这种不断累加的方式。rep(k,1,x){memset(dp,0,sizeof(dp));rep(l,k,x){rep(t,1,y) dp[t] f[l][t];int sum 0;rep(t,1,y){if( sum 0 ) sum dp[t];else sum dp[t];if( ans sum ) ans sum;}}}}}return ans;
}int main()
{h read(), x read(), y read();rep(i,1,h){rep(j,1,x){rep(k,1,y){key[i][j][k] read();key[i][j][k] key[i-1][j][k];}}}int ans maxsum3();printf(%d\n, ans);return 0;
} 多学多积累加油。 转载于:https://www.cnblogs.com/83131yyl/p/5031028.html