dp

hdu 6739 Invoker

北城余情 提交于 2019-11-30 16:32:25
Invoker Problem Description 在 dota2 中有一个叫做祈求者(Invoker)的英雄,在游戏中他有三个基础技能:冰(Quas),雷(Wex),火(Exort),每施展一个技能就可以获得相应属性的一个法球(element)。 但是祈求者同时最多只能有三个法球,即如果他在有三个法球的状态下又使用了某个法球技能,那么他会获得该法球,并失去之前三个法球中最先获得的一个。 不难得出,祈求者身上的三个法球的**无顺序**组合有 10 种,每一种都对应着一个组合技能: 1. 急速冷却(Cold Snap),无序组合 QQQ,用 Y 表示 2. 幽灵漫步(Ghost Walk),无序组合 QQW,用 V 表示 3. 寒冰之墙(Ice Wall),无序组合 QQE,用 G 表示 4. 电磁脉冲(EMP),无序组合 WWW,用 C 表示 5. 强袭飓风(Tornado),无序组合 QWW,用 X 表示 6. 灵动迅捷(Alacrity),无序组合 WWE,用 Z 表示 7. 阳炎冲击(Sun Strike),无序组合 EEE,用 T 表示 8. 熔炉精灵(Forge Spirit),无序组合 QEE,用 F 表示 9. 混沌陨石(Chaos Meteor),无序组合 WEE,用 D 表示 10. 超震声波(Deafening Blast),无序组合 QWE,用 B 表示

[多校联考-初级]徒步旅行

丶灬走出姿态 提交于 2019-11-30 16:01:39
题目 【内存限制:$512 MiB$】  【 时间限制:$2000 ms$】 【标准输入输出】  【 题目类型:传统】  【 评测方式:文本比较】 【题目描述】 小$A$决定开始一场奇妙的徒步旅行,旅行地图可以看成是一个平面直角坐标系,小$A$从家$O(0,0)$出发,每一步移动只能由他此时所在的位置$(x,y)$走到以下四个坐标之一:$(x-1,y),(x,y-1),(x+1,y),(x,y+1)$。现在有$N$个旅游景点,第$i$个旅游景点位置为$(x_i,y_i)$。 由于世界如此之大,整个旅行地图被分成了多个不同的气候区,某个景点$(x_i,y_i)$的气候区$C_i=max(x_i,y_i)$。小$A$想要更好的了解这个世界使得他这次徒步旅行更有意义,所以他想要去气候区$i+1$旅行当且仅当访问完气候区$i$的所有旅游景点。当他访问完所有的景点时,他会回到家里。 小$A$想让你帮他设计出一条旅游路线使得他移动的步数最少,因为徒步旅行还是比较累的…… 【输入格式】 第一行输入一个整数$N$,表示旅游景点数量。 接下来$N$行,每行一个整数对$(x_i,y_i)$代表第$i$个景区的位置。 【输出格式】 仅一行,表示小$A$完成旅行所需移动的最少步数。 【数据范围】 对于所有测试数据: $1≤n≤3 * 10^5$ $0≤h≤10^9$ $0≤x,y≤10^9$ 题解

贪心与DP——P1987摇钱树

有些话、适合烂在心里 提交于 2019-11-30 14:29:44
题目: P1987 摇钱树 \(\text{蒟蒻在DP之路上求索着}\) 这道题我一开始竟然觉得是区间DP 思路 看起来这道题我们可以以任何顺序来砍树,这就牵扯到先后砍树哪一种更优.如果我们要暴力的话,那就是枚举树的全排列,然后寻找最优解.可是如果我们不枚举,有没有办法通过一些方法判断出哪一棵树先砍呢? 还记得国王游戏吗,在那一题中我们讨论了邻项交换法来寻找贪心策略.我们不妨来尝试一下. 假设一棵树上的总钱数是 \(A\) ,每天掉落 \(a\) 个,另一棵树是 \(B\) 和 \(b\) .我们先按照 \(A,B\) 的顺序在时间 \(x\) 和 \(x+1\) 砍掉.这时我们将会得到的收益为 \(A-ax+B-b(x+1)[1]\) .而我们交换 \(AB\) ,得到的收益是 \(A-a(x+1)+B-bx[2]\) ,如果先砍 \(A\) 更优,那么我们要求 \([1]\) 式- \([2]\) 式要大于0.经过整理,我们发现此时 \(a-b>0\) ,也就是 \(a>b\) .现在我们可以得出结论了:先砍倒掉钱速度快的树更划算.因此我们要按照掉落速度从大到小排序. 但是我们只能砍掉K棵树,也就是说我们上文提到的 \(B\) 不一定能砍掉,然而我们的交换是在两棵树都能砍掉的前提下进行的,因此要有所取舍.这就是一个容量是K的01背包问题.设 \(f[j]\) 表示砍掉 \(i\

91

血红的双手。 提交于 2019-11-30 13:30:23
/* 这个问题可以分解成很多的子问题,比如以某数字开头的序列一共有多少种解码方法。这种分治的问题可以使用递归的方法。 由于在递归的过程中,有很多是重复的计算,所以可以使用动态规划的方法将计算过的中间结果保存起来,以加快计算。 */ class Solution { public int numDecodings(String s) { int len = s.length(); int[] dp = new int[len + 1]; dp[len] = 1; if(s.charAt(len - 1) == '0'){ dp[len - 1] = 0; } else{ dp[len - 1] = 1; } for(int i = len - 2; i >= 0; i--){ if(s.charAt(i) == '0'){ dp[i] = 0; continue; } if((s.charAt(i) - '0') * 10 + (s.charAt(i+1) - '0') <= 26){ dp[i] = dp[i+1] + dp[i+2]; } else{ dp[i] = dp[i+1]; } } return dp[0]; } } 来源: https://www.cnblogs.com/zhaijiayu/p/11593912.html

概率dp poj 3071

末鹿安然 提交于 2019-11-30 11:24:11
题目首先给出一个n,表示比赛一共进行n轮,那么队伍就有2^n只队伍 输入一个2^n*2^n的矩阵,p[i][j]代表队伍i打败队伍j的概率 dp[i][j]代表第i轮比赛的时候,队伍j赢的概率 首先初始化时,dp[0][i]=1,在没有比赛时每个队伍都是赢的 dp[i][j]+=dp[i-1]j[*dp[i-1][k]*p[j][k]:要求j和k的上一轮都是赢家的概率再乘以本轮j打败k的概率 特别注意,队伍只能相邻的打,相邻的队伍转换成二进制时,高位相同,到第i位正好相反 可以用 if(((j>>(i-1))^1)==(k>>(i-1)))来判断,是否相邻,或者是下面代码中我所用的方法 因为最开始一轮两两相邻的打,只有二进制中的最后一位不一样,第二轮时,上一轮的赢家相邻的打,是第二位不一样 很巧妙 ———————————————— 版权声明:本文为CSDN博主「Cherry_0525」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_41037114/article/details/81906416 1 #include<cstdio> 2 #include<algorithm> 3 #include<string.h> 4 #include<math.h> 5 using

Android 第四课——AndroidManifest.xml

╄→尐↘猪︶ㄣ 提交于 2019-11-30 10:59:58
清单文件的具体介绍 在 Android 项目中,下一个重要的文件是清单文件。观察一下 AndroidManifest.xml 文 件的内容: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.learn2develop.HelloWorld" android:versionCode="1" android:versionName="1.0.0" > <uses-sdk android:minSdkVersion="14" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".HelloWorldActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.

Educational Codeforces Round 73 (Rated for Div. 2)D(DP,思维)

半世苍凉 提交于 2019-11-30 06:14:05
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; long long a[300007],b[300007]; long long dp[300007][5]; long long ans; int main(){ ios::sync_with_stdio(false);//多组数据输入cin,cout容易超时 cin.tie(NULL); cout.tie(NULL); int q; cin>>q; while(q--){ int n; ans=2e18; cin>>n; dp[1][0]=0;//第二维表示第一维增加的高度,0即不增加,花费也是0 dp[1][1]=b[1];//增加1高度花费为b[1] dp[1][2]=2e18;//第一个点最多只需要增加1高度就可以与a[2]不同,所以花费初始化为最大值 for(int i=2;i<=n;++i){//初始化 dp[i][0]=2e18; dp[i][1]=2e18; dp[i][2]=2e18; } for(int i=1;i<=n;++i) cin>>a[i]>>b[i]; for(int i=2;i<=n;++i){ for(int j=0;j<3;++j){ for(int k=0;k<3;++k){ if(k+a[i]

lc 1199. Minimum Time to Build Blocks

纵饮孤独 提交于 2019-11-30 06:01:34
简直精妙。 哈夫曼编码? 我用的是dp,这种区间dp的时间复杂度是真的难算!状态转移方程为n的区间dp时间都算作n^3吧。 先把任务 从长到短排序 ,然后看worker在那一层要细分多少?就是位置i和员工数n的dp转移。 但是可以 贪心 !!!!!!!!!!!!每次都是把时间最短的放在最后,而且这两个必然 同父 ,合体后与其他点没有任何差异,继续找最短的合体。 dp代码(python过不了,c++可以): class Solution: def minBuildTime(self, ns, l) -> int: dp={} ns.sort(reverse=True) mx=l*len(ns)*ns[0] def get(i,n): if i==len(ns): return 0 if n==0: return mx lst = len(ns) - i if n >= lst: return ns[i] if (i,n) in dp: return dp[(i,n)] ans=max(ns[i],get(i+1,n-1)) ans=min(ans,l+get(i,n*2)) dp[(i,n)]=ans return ans # for i in reversed(range(len(ns))): # lst=len(ns)-i # for j in range(1,lst+1): #

概率dp poj2096

纵饮孤独 提交于 2019-11-30 05:50:59
1 /** 2 dp求期望的题。 3 题意:一个软件有s个子系统,会产生n种bug。 4 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中。 5 求找到所有的n种bug,且每个子系统都找到bug,这样所要的天数的期望。 6 需要注意的是:bug的数量是无穷大的,所以发现一个bug,出现在某个子系统的概率是1/s, 7 属于某种类型的概率是1/n。 8 解法: 9 dp[i][j]表示已经找到i种bug,并存在于j个子系统中,要达到目标状态的天数的期望。 10 显然,dp[n][s]=0,因为已经达到目标了。而dp[0][0]就是我们要求的答案。 11 dp[i][j]状态可以转化成以下四种: 12 dp[i][j] 发现一个bug属于已经找到的i种bug和j个子系统中 13 dp[i+1][j] 发现一个bug属于新的一种bug,但属于已经找到的j种子系统 14 dp[i][j+1] 发现一个bug属于已经找到的i种bug,但属于新的子系统 15 dp[i+1][j+1]发现一个bug属于新的一种bug和新的一个子系统 16 以上四种的概率分别为: 17 p1 = i*j / (n*s) 18 p2 = (n-i)*j / (n*s) 19 p3 = i*(s-j) / (n*s) 20 p4 = (n-i)*(s-j) / (n*s) 21 又有

POJ 1661 Help Jimmy

﹥>﹥吖頭↗ 提交于 2019-11-30 05:45:42
题目链接: http://poj.org/problem?id=1661 分析: 类似于最长递增子序列的dp题;坑点:如果下落过程中碰到板,那么必须在改板向左右再下落,不可以穿板,所以找到一次,该方向(左或者右)就不需要再找了 1 #include<iostream> 2 #include<sstream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<string> 6 #include<cstring> 7 #include<algorithm> 8 #include<functional> 9 #include<iomanip> 10 #include<numeric> 11 #include<cmath> 12 #include<queue> 13 #include<vector> 14 #include<set> 15 #include<cctype> 16 const double PI = acos(-1.0); 17 const int INF = 0x3f3f3f3f; 18 const int NINF = -INF - 1; 19 const int maxn = 1e3 + 5; 20 typedef long long ll; 21 #define MOD 1000000007 22 using