摘要:
题意:有一个不递减的序列,现在要把这些数分成若干个部分,每部分不能少于m个数。每部分的权值为所有数减去该部分最小的数的和。求最小的总权值。 析:状态方程很容易写出来,dp[i] = min{dp[j] + sum[i] - sum[j] - (i-j)*a[j+1] },然而这个复杂度是 O(n^2 阅读全文
摘要:
题意:有 t 只老虎,d只鹿,还有一个人,每天都要有两个生物碰面,1.老虎和老虎碰面,两只老虎就会同归于尽 2.老虎和人碰面或者和鹿碰面,老虎都会吃掉对方 3.人和鹿碰面,人可以选择杀或者不杀该鹿4.鹿和鹿碰面,没事问人存活下来的概率 析:最后存活肯定是老虎没了,首先可以用概率dp来解决,dp[i] 阅读全文
摘要:
题意:给出一个n面的色子,问看到每个面的投掷次数期望是多少。 析:这个题很水啊,就是他解释样例解释的太。。。我鄙视他,,,,, dp[i] 表示 已经看到 i 面的期望是多少,然后两种选择一种是看到新的一面,另一种是看到旧的一面,然后就很出答案了。 代码如下: 阅读全文
摘要:
题意:给定一个人抢劫每个银行的被抓的概率和该银行的钱数,问你在他在不被抓的情况下,能抢劫的最多数量。 析:01背包,用钱数作背包容量,dp[j] = max(dp[j], dp[j-a[i] * (1.0 - pp[i])),dp[i] 表示不被抓的最大概率,在能抢劫到 i 个钱。 代码如下: 阅读全文
摘要:
题意:给定一个数 n,然后每次除以他的一个因数,如果除到1则结束,问期望是多少。 析:概率DP,可以用记忆公搜索来做,dp[i] = 1/m*sum(dp[j] + 1) + 1/m * (dp[i] + 1) ==> dp[i] = (sum(dp[j]) + m) / (m-1)。其中m是因数个 阅读全文
摘要:
题意:你面前有 n 个门,每次你可以选择任意一个进去,如果xi是正数,你将在xi后出去,如果xi是负数,那么xi后你将回来并且丢失所有记忆,问你出去的期望。 析:两种情况,第一种是直接出去,期望就是 1/n * xi 第二种是回来了,再出去 1/n*(-xi+E), 然后就可以得到 E = sum 阅读全文
摘要:
题意:给定上一个串,让你在后面添加一些字符,使得这个串成为一个回文串。 析:先用manacher算法进行处理如果发现有字符匹配超过最长的了,结束匹配,答案就是该字符前面那个长度加上该串原来的长度。 代码如下: 阅读全文
摘要:
//输入,并处理得到字符串s int p[1000], mx = 0, id = 0; memset(p, 0, sizeof(p)); for (i = 1; s[i] != '\0'; i++) { p[i] = mx > i ? min(p[2*id-i], mx-i) : 1; while (s[i + p[i]] == s[i - p[i]]) p[i]++; ... 阅读全文