随笔分类 - 动态规划
摘要:思路:直接通过斜率优化进行求解。#include#include#include#include#include#define Maxn 1000010using namespace std;__int64 sum[Maxn];__int64 num[Maxn];int que[Maxn*4];int main(){ int n,k,head,rear,x; int i,j; double ans; while(scanf("%d%d",&n,&k)!=EOF){ ans=0; for(i=1;i=(sum[i]-sum[que[head]]...
阅读全文
摘要:思路:很普通的斜率dp#include#include#include#include#define Maxn 10010#define LL intusing namespace std;LL dp[Maxn][2],num[Maxn];int que[Maxn*10];inline LL getleft(int x,int j,int k){ return dp[j][x]+num[j+1]*num[j+1]-(dp[k][x]+num[k+1]*num[k+1]);}inline LL getright(int j,int k){ return 2*(num[j+1]-num...
阅读全文
摘要:思路:dp[i]=dp[j]+(sum[i]-sum[j])^2+m;剩下的就是普通斜率dp做法。#include#include#include#include#include#define Maxn 500010#define LL __int64using namespace std;LL dp[Maxn],num[Maxn],sum[Maxn];int que[Maxn*2];LL getleft(int j,int k){ return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]);}LL getright(int j,int k){ ...
阅读全文
摘要:思路:dp[i][x]=dp[j][x-1]+val[i]-val[j]-sum[j]*sum[i]+sum[j]*sum[j];其中val[i]表示1~~i是一段的权值。然后就是普通斜率dp做法。#include#include#include#include#include#define Maxn 1010#define LL __int64using namespace std;LL dp[Maxn][Maxn],num[Maxn],sum[Maxn],val[Maxn];int que[Maxn*10];LL getleft(int x,int j,int k){ return ...
阅读全文
摘要:思路:dp[i]=dp[j]+sum[i]-sum[j]-(i-j)*num[j+1];然后就是比较斜率。注意的时这里j+t#include#include#include#include#define Maxn 400010#define LL __int64using namespace std;LL num[Maxn],sum[Maxn],dp[Maxn];int que[Maxn*10];LL Getleft(int j,int k){ return dp[j]-sum[j]+j*num[j+1]-(dp[k]-sum[k]+k*num[k+1]);}LL Getright(in...
阅读全文
摘要:思路:dp[i][j][x]表示状态 i 以 j 为结束 得分为 x 的方案数。#include#include#include#include#includeusing namespace std;int dp[5000][13][40],g[5][5],d[13][13],n,l,ans;bool vi[13],ntou[13];struct Point{ int x,y;}p[13];bool OK(int a,int b){ int x1,y1,x2,y2,i; x1=p[a].x,y1=p[a].y; x2=p[b].x,y2=p[b].y; if(x1...
阅读全文
摘要:思路:dp[i]=dp[j]+(num[i]-num[j+1])^2;#include#include#include#include#define Maxn 1000010#define LL unsigned __int64using namespace std;LL dp[Maxn],num[Maxn];int que[Maxn*3];inline int ReadInt(){ char ch = getchar(); int data = 0; while (ch '9') ch = getchar(); do { ...
阅读全文
摘要:思路:对于TT来说,如果数量分别为a a b或 a b a,或 b a a的形式,那么TT必赢,因为TT可以使其成为 a a a的形式,那么不论DD 怎么拿,都是TT最后使其成为a a a 的形式,00 0也是a a a的形式,故TT胜。同样,存在必败局。如果a,b,c是先手的必败局,那么将其中某个数加k,或将其中某两个数同时加k,那么就成了先手的必胜局。#include#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp ma
阅读全文
摘要:思路:每次枚举每个工人的右边界j,维护最优的左边界k。那么dp[j]=max(dp[j],dp[k]+(j-k)*w[i].p);对于每个工人的初值k=w[i].s-1;令x=j-w[i].l,如果(k-x)*w[i].p>dp[k]-dp[x],则k=x。#include#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 170010#define Maxm 200010#d
阅读全文
摘要:思路:dp[i]=min{dp[j]+max(num[j+1]...num[i])},其中sum[i]-sum[j]#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 100010#define Maxm 200010#define Y 1100#define LL __int64#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (x
阅读全文
摘要:思路:特水的一个最长回文子序列动态规划。比赛时硬卡第一题,49WA后终于AC,可惜没时间做这题,结果成绩也就可想而知了。兔子跳一样权值的石头,并且一个正跳,一个反跳,这不就是个回文子序列吗?????!!!!#include#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 1010#define Maxm 200010#define LL __int64#define Abs(x)
阅读全文
摘要:思路:dp[i]表示到第i个点为结尾能获得的最大值,那么dp[i]=h[i]*h[i]+dp[i-x]-h[i-x];(i-l#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 100010#define Maxm 80002#define LL __int64#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (x>1; }}tree[Maxn
阅读全文
摘要:思路:dp[i][0]表示第i个节点为根的子树变成以i为一头的长链最小的花费,dp[i][0]表示表示第i个节点为根的子树变成i不是头的长链最小花费。那么动态方程也就不难想了,就是要分几个情况处理,细心就好。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#define inf 10000000#define Maxn 1100010using namespace std;int vi[Maxn],head[Maxn],ans,e,d
阅读全文
摘要:思路:其实这题是个挺水的动态规划,一开始就能AC,可是不知道错哪了,瞎改瞎交,WA了数十次。AC之后怎么改都是AC,也不知道改了什么地方,郁闷死了~~~难道开始时的测试数据有问题???dp[i][j]表示第i天在第j个地方的最大概率,那么dp[i][j]=max(dp[i][j],dp[i-1][k]+p[k][j]+we[i][weh[j]]);p[k][j]表示从k到j的概率,we[i][j]表示第i个地方出现j天气的概率。#include#include#include#include#include#include#define inf 100000000#define eps 1e-
阅读全文
摘要:思路:这个没思路,看了陈启峰的论文写得。#include#include#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 1010#define Maxm 80002#define LL __int64#define Abs(x) ((x)>0?(x):(-(x)))#define lson(x) (xd[u]){dp[u][i]=inf;continue;} dp[...
阅读全文
摘要:思路:这是一道坑爹的动态规划,思路很容易想到,就是细节。用dp[t][i][j],表示在第t时间,锤子停在(i,j)位置能获得的最大数量。那么只要找到一个点转移到(i,j)收益最大即可。#include#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 2000010#define Maxm 80002#define LL __int64#define Abs(x) ((x)>
阅读全文
摘要:思路:简单动态规划#include#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 520#define Maxm 80002#define LL __int64#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (x<<1)#define rson(x) (x<<1|1)#define inf 0x7ffff
阅读全文
摘要:思路:dp[i][j]表示区间i,j变为回文串最少的代价.#include#include#include#include#include#include#include#include#include#include#include#define pb push_back#define mp make_pair#define Maxn 2002#define Maxm 80002#define LL __int64#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (x=1;j--){ if(str[i]==str[j]){ ...
阅读全文
摘要:思路: 每个点有三种状态,本身有塔,被子节点的塔覆盖,被父节点的塔覆盖。#include#include#include#include#include#include#include#include#include#include#include#define Maxn 10100#define Maxm 100010#define LL __int64#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (x<<1)#define rson(x) (x<<1|1)#define inf 1000000#define Mo
阅读全文
摘要:思路:dp[i][j]表示,以i节点为根,删去j个节点最少要断几条边。那么dp[u][j]=min(dp[u][j],dp[v][k]+dp[u][j-k]);//选取最优状态dp[u][j]=min(dp[u][j],dp[u][j-son[v]]+1);//切断与子节点相连的边对于子节点dp[v][n-son[v]]=1;dp[v][j]=min(dp[v][j],dp[v][j-n+son[v]]+1)//表示不需要由父节点过来的那条分支最有从所有状态中选举最优的dp[i][n-p];#include#include#include#include#include#include#inc
阅读全文

浙公网安备 33010602011771号