一些常见的优化:读入优化,滚动数组 1.读入优化 我们平时所使用的scanf,cin速度都较慢,当读入的数据达到10^5规模以上时,就会开始显现劣势 而c中自带的getchar函数读入速度较快,可以用来优化数字的读入速度。 1inlineintget_num()2{3intnum =0;4charc;5boolflag =false;6while((c = getchar()) ==''|| ...
对于这个题目还有一个问题,就是空间不够,要使用滚动数组,每次key=n&1代表着第n个数,!key代表第n-1个数就行了。 还有一个坑点,对于每个询问不能一次一次求,一定T,先保存所有询问,再在滚动过程中保存答案最后输出即可。代码:#include <iostream> #include <algorithm> #include<cstdio> #include<cmath> #inc...
C. Arcade dp二维费用背包 + 滚动数组 玄学 http://codeforces.com/gym/101257/problem/C 询问从左上角走到右下角,每次只能向右或者向左,捡起三种物品算作一个logo,求最多能得到多少个logo。 设dp[i][j][k][h]表示走到(i, j)这个格子,然后得到的第一种物品是k,第二种物品是h的时候,能...
滚动数组思想 滚动数组思想滚动数组思想 描述 让数组滚动起来,每次使⽤固定的⼏个存储空间,来达到节省空间的⽬的,常⽤于DP(动态规划)的优化例⼦ 斐波那契数列:获取第n个斐波那契数列值 <?php function sequence($n){ $p1 = 1;$p2 = 1;for ($i = 3;$i <= $n;$i++) { $p3 = $p1+$...
因为N等于5000,所以int会MLE,不过使用short int 就不会。也可以使用滚动数组 因为dp[i][j]都是又他的左边,上边,左上得来的,所以滚动数组可以开到2.很省内存。 short int 过的 #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> ...
vector<int>d[maxA]; voidsieve(intx){ for(inti=1;i<=x;i++){ for(intj=1;j<=x/i;j++){ d[i*j].push_back(i); } } } 所以总的时间复杂度为O(nlogmax(ai))O(nlogmax(ai)) 代码 #include<iostream> #include<cstdio>
dp[i][j][x][y]表示走到i,j这个位置经过>,|分别为x,y次这种情况是否存在。这个数组是100*100*200*200的,发现爆内存。。。 然后就有滚动数组这个东西了,因为当扫到第i行时,只有上一行有用,那么就可以将之前的删了,所以就可以开3*100*200*200的。
因为dp转移只和一层状态有关,所以直接滚动数组优化 代码 #include<bits/stdc++.h> using namespace std; int n,m; int mp[520][520]; int sum[520][520]; int vis[520][520]; int dp[520][520][2]; int cal(int x1,int y1,int x2,int y2) ...
minv=-100000; NULL=-2139062144; var n,i,j,ans,p,np:longint; ts,tf:array[1..maxn] of longint; f:array[0..1,minv..maxv] of longint; function max(a,b:longint):longint; begin if a
C. Arcade dp二维费用背包 + 滚动数组 玄学 http://codeforces.com/gym/101257/problem/C 询问从左上角走到右下角,每次只能向右或者向左,捡起三种物品算作一个logo,求最多能得到多少个logo。 设dp[i][j][k][h]表示走到(i, j)这个格子,然后得到的第一种物品是k,第二种物品是h的时候,能得到的第三...