A - Frog 1/B - Frog 2

入门...

 #include<cstdio>
#define abs(a) ((a)>=0?(a):(-(a)))
#define min(a,b) ((a)<(b)?(a):(b))
#define maxn 100050
using namespace std;
int dp[maxn],a[maxn];
int main(){
int n,k=;
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%d",&a[i]),dp[i]=1e9;
dp[]=;
for (int i=;i<=n;i++){
for (int j=;j<=k;j++)
if (i-j>) dp[i]=min(dp[i],dp[i-j]+abs(a[i-j]-a[i]));
}
printf("%d\n",dp[n]);
return ;
}

A and B

C - Vacation

$dp[i][0/1/2]$ 表示到第 $i$ 个 这一个选 $0/1/2$ 转移就很显然了....

 #include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
#define maxn 100050
using namespace std;
int dp[maxn][];
int main(){
int n;
scanf("%d",&n);
for (int i=;i<=n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
dp[i][]=max(dp[i-][],dp[i-][])+a;
dp[i][]=max(dp[i-][],dp[i-][])+b;
dp[i][]=max(dp[i-][],dp[i-][])+c;
}
printf("%d\n",max(max(dp[n][],dp[n][]),dp[n][]));
return ;
}

C

D - Knapsack 1

裸背包

 #include<cstdio>
#define ll long long
#define max(a,b) (a>b?a:b)
#define maxn 100050
using namespace std;
ll dp[maxn];
int main(){
int n,W;
scanf("%d%d",&n,&W);
for (int i=;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
for (int j=W;j>=a;j--)
dp[j]=max(dp[j-a]+b,dp[j]);
}
ll ans=;
for (int j=;j<=W;j++)
if (dp[j]>ans) ans=dp[j];
printf("%lld\n",ans);
return ;
}

D

E - Knapsack 2

发现价值比较小,那么换一下 $dp$ 的状态表示

$dp[j]$ 表示价值为 $j$ 的最小重量

答案就从大到小枚举 $\leq W$ 的即可。

 #include<cstdio>
#define ll long long
#define max(a,b) (a>b?a:b)
#define maxn 100050
#define min(a,b) (a<b?a:b)
using namespace std;
ll dp[maxn];
int main(){
int n,W;
scanf("%d%d",&n,&W);
for (int j=;j<=1e5;j++)
dp[j]=1e12;
for (int i=;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
for (int j=1e5;j>=b;j--)
dp[j]=min(dp[j-b]+a,dp[j]);
}
for (int i=1e5;i>=;i--)
if (dp[i]<=W) return printf("%d\n",i),;
return ;
}
/*
dp[i][j]表示前i个价值和为j的最小重量
*/

E

F - LCS

裸的最长公共子序列...方案存一下转移路径倒推就好了

 #include<cstdio>
#include<cstring>
#define maxn 3005
using namespace std;
int dp[maxn][maxn],last[maxn][maxn];
char s[maxn],t[maxn],w[maxn];
int main(){
scanf("%s%s",s+,t+);
int n=strlen(s+),m=strlen(t+);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++){
if (s[i]==t[j]) {
if (dp[i][j]<dp[i-][j-]+) dp[i][j]=dp[i-][j-]+,last[i][j]=;
}
if (dp[i-][j]>dp[i][j]) dp[i][j]=dp[i-][j],last[i][j]=;
if (dp[i][j-]>dp[i][j]) dp[i][j]=dp[i][j-],last[i][j]=;
}
int x=n,y=m;
while (dp[x][y]){
if (last[x][y]==) w[dp[x][y]]=s[x],x--,y--;else
if (last[x][y]==) x--;else y--;
}
for (int i=;i<=dp[n][m];i++)
printf("%c",w[i]);
printf("\n");
return ;
}

F

G - Longest Path

最长路径,拓扑上dp

 #include<cstdio>
#define maxn 100050
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
struct enode{
int nxt,y;
}e[maxn];
int ans=,tot=;
int n,m;
int q[maxn],dp[maxn],first[maxn],goin[maxn];
void adde(int x,int y){
e[tot].nxt=first[x];
e[tot].y=y;
first[x]=tot++;
goin[y]++;
}
void tupu(){
int head=,tail=;
for (int i=;i<=n;i++)
if (!goin[i]) q[++tail]=i;
while (head<=tail){
int x=q[head++];
if (dp[x]>ans) ans=dp[x];
for (int i=first[x];i>=;i=e[i].nxt){
int y=e[i].y;
goin[y]--;
dp[y]=max(dp[x]+,dp[y]);
if (!goin[y]) q[++tail]=y;
}
}
}
int main(){ scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
first[i]=-;
for (int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
adde(x,y);
}
tupu();
printf("%d\n",ans);
return ;
}

G

H - Grid 1

唔...入门dp吧QAQ

 #include<cstdio>
#define HR 1000000007
using namespace std;
char s[];
int dp[][];
int main(){
int n,m;
scanf("%d%d",&n,&m);
dp[][]=;
for (int i=;i<=n;i++){
scanf("%s",s+);
for (int j=;j<=m;j++)
if ((i!=||j!=)&&(s[j]!='#')) dp[i][j]=(dp[i-][j]+dp[i][j-])%HR;
}
printf("%d\n",dp[n][m]);
return ;
}

H

I - Coins

概率dp

$dp[i][j]$ 表示前 $i$ 个有 $j$ 个向上的概率

那么对于当前这一个 要不然就向上 要不然就向下

$dp[i][j]=dp[i-1][j-1]*p[i]+dp[i-1][j]*(1-p[i])$

 #include<cstdio>
using namespace std;
double p[],dp[][];
int main(){
int n;
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%lf",&p[i]);
dp[][]=;
for (int i=;i<=n;i++){
dp[i][]=dp[i-][]*(-p[i]);
for (int j=;j<=i;j++)
dp[i][j]=dp[i-][j-]*p[i]+dp[i-][j]*(-p[i]);
} double ans=;
for (int i=;i<=n;i++)
if (i>n-i) ans+=dp[n][i];
printf("%.10lf\n",ans);
return ;
}

I

J - Sushi

期望dp

$dp[i][j][k]$ 表示 $1$ 有 $i$ 个,$2$ 有 $j$ 个,$3$ 有 $k$ 个的期望

$dp[i][j][k]=dp[i-1][j][k]\times \frac{i}{n}+dp[i+1][j-1][k]\times \frac{j}{n}+dp[i][j+1][k-1]\times \frac{k}{n}+dp[i][j][k]\times \frac{n-i-j-k}{n}+1$

$dp[i][j][k]\times \frac{i+j+k}{n}=dp[i-1][j][k]\times \frac{i}{n}+dp[i+1][j-1][k]\times \frac{j}{n}+dp[i][j+1][k-1]\times \frac{k}{n}+1$

$dp[i][j][k]\times(i+j+k)=dp[i-1][j][k]\times i+dp[i+1][j-1][k]\times j+dp[i][j+1][k-1]\times k+n$

$dp[i][j][k]=dp[i-1][j][k]\times \frac{i}{i+j+k}+dp[i+1][j-1][k]\times \frac{j}{i+j+k}+dp[i][j+1][k-1]\times \frac{k}{i+j+k}+\frac{n}{i+j+k}$

 #include<cstdio>
using namespace std;
double dp[][][];
int a[];
int main(){
int n;
scanf("%d",&n);
for (int i=;i<=n;i++){
int x;
scanf("%d",&x);
a[x]++;
}
for (int k=;k<=n;k++)
for (int j=;j<=n;j++)
for (int i=;i<=n;i++)
if (i||j||k) {
if (i) dp[i][j][k]+=dp[i-][j][k]*i/(i+j+k);
if (j) dp[i][j][k]+=dp[i+][j-][k]*j/(i+j+k);
if (k) dp[i][j][k]+=dp[i][j+][k-]*k/(i+j+k);
dp[i][j][k]+=(double)n/(i+j+k);
}
printf("%.15lf\n",dp[a[]][a[]][a[]]);
return ;
} /*
dp[i][j][k]表示当前有i个1 j个2 k个3 的期望步数 dp[0][0][0]=0 dp[i][j][k]=dp[i-1][j][k]*i/n+dp[i+1][j-1][k]*j/n+dp[i][j+1][k-1]*k/n+dp[i][j][k]*(n-i-j-k)/n+1
dp[i][j][k]*(i+j+k)/n=dp[i-1][j][k]*i/n+dp[i+1][j-1][k]*j/n+dp[i][j+1][k-1]*k/n+1
dp[i][j][k]*(i+j+k)=dp[i-1][j][k]*i+dp[i+1][j-1][k]*j+dp[i][j+1][k-1]*k+n
dp[i][j][k]=dp[i-1][j][k]*i/(i+j+k)+dp[i+1][j-1][k]*j/(i+j+k)+dp[i][j+1][k-1]*k/(i+j+k)+n/(i+j+k) */

J

Atcoder Educational DP Contest 题解的更多相关文章

  1. Atcoder Educational DP Contest I - Coins (概率DP)

    题意:有\(n\)枚硬币,每枚硬币抛完后向上的概率为\(p[i]\),现在求抛完后向上的硬币个数大于向下的概率. 题解:我们用二维的\(dp[i][j]\)来表示状态,\(i\)表示当前抛的是第\(i ...

  2. AtCoder Educational DP Contest 总结

    前言 感觉都初一升初二了,再做这个题是不是有点太菜了啊-- 里面大概都是些 DP 板子题(确信,题目质量还挺高的,不过不涉及太难的优化(实际上只有最后一题是斜率优化). 不管了,还是写个 blog 来 ...

  3. Atcoder Educational DP Contest

    前面简单一点的题直接过吧. A 暴力DP B 怎么还是暴力DP C 还是暴力DP D 直接背包 E 这个背包不太一样了,这里有一个技巧,就是因为价值很小,所以直接对价值背包,求出来达到某一个权值最小的 ...

  4. Sth about Educational DP Contest

    Contest Website : atcoder.jp/contests/dp \[\begin{array}{c|C|c|c} TaskNum & TaskName & Statu ...

  5. Educational DP Contest H - Grid 1 (DP)

    题意:有一个\(n\)X\(m\)的图,"#"表示障碍物,"."表示道路,只能向右或向下走,问从左上角走到右下角的方案数. 题解:这题可以用bfs来搞,但dp更 ...

  6. Educational DP Contest G - Longest Path (dp,拓扑排序)

    题意:给你一张DAG,求图中的最长路径. 题解:用拓扑排序一个点一个点的拿掉,然后dp记录步数即可. 代码: int n,m; int a,b; vector<int> v[N]; int ...

  7. Educational DP Contest F - LCS (LCS输出路径)

    题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...

  8. Educational DP Contest E - Knapsack 2 (01背包进阶版)

    题意:有\(n\)个物品,第\(i\)个物品价值\(v_{i}\),体积为\(w_{i}\),你有容量为\(W\)的背包,求能放物品的最大价值. 题解:经典01背包,但是物品的最大体积给到了\(10^ ...

  9. 【DP】Educational DP Contest

    这份 dp 题单的最后几题好难 orz. 前面的题比较简单,所以我会选取一些题来讲,其它的直接看代码理解吧 qwq. 传送门: https://atcoder.jp/contests/dp 全部 AC ...

随机推荐

  1. 【FFMPEG】FFMPEG介绍

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它包括了目前领先的音/视频编码库libavcodec. FFmpeg是在Linux下开发出来的,但它可以在包括Wi ...

  2. OpenCV.CV_FOURCC

    1.c++ - how to use CV_CAP_PROP_FOURCC_ - Stack Overflow.html(https://stackoverflow.com/questions/223 ...

  3. NDK学习笔记-JNI的引用

    JNI中的引用意在告知虚拟机何时回收一个JNI变量 JNI引用变量分为局部引用和全局引用 局部引用 局部引用,通过DeletLocalRef手动释放对象 原因 访问一个很大的Java对象,使用之后还用 ...

  4. layui layer.open弹出框获取不了 input框的值

    layer.open({ title:'添加管理员', type: 1, content: $('.add_html').html(), btn:['添加', '取消'], btnAlign:'c', ...

  5. Nuxt.js入门学习

    Nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).再直白点说,就是Vue.js原来是开发SPA(单页应用)的,但是随着技术的普及,很多人想用Vue开发多页应用, ...

  6. js函数(3)

    8.5 作为命名空间的函数 即定义一个函数用做临时的命名空间,在这个命名空间内定义的变量都不会污染到全局命名空间. 将一段代码封装在函数内部,然后调用这个函数.这样全局变量就变成了函数内部的局部变量: ...

  7. 《鸟哥的Linux私房菜:基础学习篇》第二部分读书笔记

    一.Linux的文件权限与目录配置 1. Linux用户身份与用户组记录的文件:默认情况下,/etc/passwd记录所有的系统账号与一般身份账号及root的相关信息,/etc/shadow记录个人的 ...

  8. kafka producer interceptor拦截器(五)

    producer在发送数据时,会经过拦截器和序列化,最后到达相应的分区.在经过拦截器时,我们可以对发送的数据做进步的处理. 要正确的使用拦截器需要以下步骤: 1.实现拦截器ProducerInterc ...

  9. 【转贴】内存重要参数详解 RAS CAS

    内存重要参数详解 RAS CAS 分类: LINUX 2014-09-12 09:41:58 原文地址:内存重要参数详解 RAS CAS 作者:Reny http://blog.chinaunix.n ...

  10. html当中如何引用js文件

    3)html当中如何引用js文件 如果需要javascript工程师和html美工各干各的工作,需要分开写文件. 例 1.2 <html><head>    <scrip ...