算法
文章平均质量分 70
AcYan1989
这个作者很懒,什么都没留下…
展开
-
求回文字符串的最小分割
给定一个字符串s,分割s使得每个子串都是回文的,求最少的分割次数。解决方法:动态规划,dp[i]表示前i个字符串的最小分割次数,p[i][j]表示字符串s从i到j的子串是否是一个回文字符串。状态转移方程为:dp[i]=min(dp[i],dp[j-1]+1 if p[j][i]=true),时间复杂度O(n^2)。int dp[100];bool p[100][100];in原创 2013-07-25 23:55:56 · 649 阅读 · 0 评论 -
hdu 2955 Robberies
简单的背包问题,需要转化首先求得所有银行的钱的总和sum,dp[j]表示抢j个钱的最大安全概率,money[i]表示第i个银行的钱,prob[i]表示在第i个银行被抓的概率然后可以列出状态转移方程:dp[j]=max(dp[j], dp[j-money[i])*(1-prob[i]))其中,j的范围是0到sum,初始化时dp[0]=1,其余均为-1int main(){原创 2013-09-02 18:20:20 · 397 阅读 · 0 评论 -
hdu 1506 Largest Rectangle in a Histogram
题意就是给定一组直方图的高,求出这组直方图能组成的最大矩形解法:对于某一块直方图的高,向左和向右找到大于等于这个高度的最远距离l和r,则当前高度能组成的最大的矩形为h*(r-l+1),遍历一遍求出最大的这个矩形即可。但是如果每次查找l和r都遍历,肯定超时,因此需要能快速的查找。具体代码如下:#define FOR(i,a,b) for (int i = (a); i <= (b); i原创 2013-09-02 21:14:08 · 416 阅读 · 0 评论 -
股票买卖问题
题目详情及解法见http://blog.csdn.net/joylnwang/article/details/7078530代码:int maxProfit(vector &prices) { int sum = 0; for(int i = 1; i < prices.size() ; ++i) { int delta = pric原创 2013-07-26 01:02:52 · 497 阅读 · 0 评论 -
填充矩阵
题目:对于一个m*n的矩阵,如果某一个元素为0,则把该元素所在行及所在列均置为0。要求只允许使用O(1)的空间。void setZeroes(vector > &matrix) { int m = matrix.size(); if (m == 0) return; int n = matrix[0].size(); bool firstRowHas0(f原创 2013-10-06 20:14:03 · 1595 阅读 · 0 评论 -
最大容器
题目:给一个正整数数组,元素的值ai代表在坐标系中的点(i,ai),根据这些点各自画出平行于y轴的线段,线段两个顶点坐标为(i,0),(i,ai)。现在,任意取这些线段中的两条,可以组成一个容器,求所有容器的最大容量。解答:贪心算法。类似于2Sum的思想,两边设一个指针,然后计算area,如果height[i] int maxArea(vector &height) {原创 2013-10-06 16:52:19 · 585 阅读 · 0 评论 -
在旋转后的排序数组中进行查找
首先,旋转的排序数组是指{4,5,6,7,0,1,2}这类的数组,就像是原本的排序数组经过左移后的效果。现在需要在这种数组中进行查找。一、数组没有重复元素。其实还是二分查找,不过比一般的二分查找情况多一些,思想是类似的。查找时间复杂度也是O(logn)。int search(int A[], int n, int target) { int low = 0, hig原创 2013-10-08 01:37:25 · 521 阅读 · 1 评论 -
满足和为定值的两个数或多个数
一、和接近定值的三个数给定一个数组,任意选三个数,求这三个数之和与给定的数最接近的组合。例如给定数组S={-1,2,1,-4},定值target=1。则结果是(-1+2+1)=2。解答:先对数组排序,之后每次选一个数,然后再固定两端,用两端向中间靠近的方式找。int threeSumClosest(vector &num, int target) { sort(nu原创 2013-10-07 11:25:47 · 706 阅读 · 0 评论