摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=2577设定两个记录数组,dp[i][0],dp[i][1],代表前i个字母所需要的最小按键数目。区别在于,dp[i][0]的情况是,w[i]这个字母(也就是最后一个)是在lock建关闭的情况下产生的最小数目。而dp[i][1]是在lock建打开的情况下产生的最小数目。因此分别考虑每种情况的dp公式char w[]数组记录字符串当w[i]为大写字母的时候,因为字母种类不是大写的就是小写字母,所以if(w[i]<=‘Z’)一句判断足矣。dp[i][0] = min(dp[i-1][0]+2,dp[i-1][ 阅读全文
摘要:
花了一整天看了马士兵老师讲的坦克大战单机版的视频,作为一名java初学者来说,收获颇多,尤其是感受到面向对象的方法,特此总结一下,以备后用。(最后会附整体代码,及详细注释)说明一下,此小游戏只是熟悉java基础只是而已,谈不上项目...大牛忽视之即可~截止此时已经实现的功能是:画出了一辆坦克,可以八个方向灵活移动,按CTRL建可以发射炮弹 。《第一阶段》做出界面:练习GUI基础知识该阶段代码 1import java.awt.*; 2import java.awt.event.*; 3 4public class TankClient extends Frame { 5 6 public vo 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=2845由于数据庞大,决不能直接DFS了,根据题目的特点,发现先对每一行DP,把每一行的最大值保存到一个数组中,再对这个数组DP一下,双重DP,不过用的同一个DP公式,挺有意思的~~~DP公式:dp[i]=max{dp[j](j<=i-2)}+w[i];#include<iostream>using namespace std;//dp1[]用来求出每一行的最大值,将最大值存入dp[2]中//最后再对dp2[]DP,就可求得整体最大值int dp1[200010],dp2[200010];// 阅读全文
摘要:
记忆化搜索又称备忘录方法,是动态规划算法的变形。记忆化搜索编写形式就是直接递归形式,自顶向下,但是加上了标记放置重复搜索、而动态规划是通过打表的形式,自底向上比如过去写的一篇日志《矩阵连乘问题》http://www.cnblogs.com/liushang0419/archive/2011/04/27/2030970.html如果用递归形式实现的话,代码如下:但是仔细思考可以发现,直接用递归实现的话 1 int recurMatrixChain(int i,int j){ 2 if(i==j)return 0; 3 int u = recurMatrixChain(i,i)+recurMatr 阅读全文
摘要:
HDOJ 2391http://acm.hdu.edu.cn/showproblem.php?pid=2391简单的DP dp[i][j] = max { dp[i-1][j], dp[i][j-1],dp[i-1][j-1] } + val[i][j];代码如下: 1 #include<iostream> 2 using namespace std; 3 int dp[1001][1001]; 4 #include<algorithm>//max()函数返回较大值 5 int main(){ 6 int t;cin>>t; 7 int m,n; 8 for 阅读全文
摘要:
在奇数个数中找到重复一半以上的数 输入数据 1.必须全为奇数 不必考虑0 负数 2.必有一个数是重复出现一半以上的 3.数据量大 卡内存 属于大数据卡内存的题目 设一个结果变量res 并用cnt来筛选 最后的结果是能使cnt不为零的数View Code 1 #include<stdio.h> 2 int main() 3 { 4 long n,num,cnt,res; 5 while(EOF != scanf("%d",&n)) 6 { 7 cnt = 0; 8 while(n--) 9 {10 scanf("%d",&num 阅读全文
摘要:
问题:给定由n个整数(可能为负整数)组成的序列e1,e2,…,en,以及一个正整数m,要求确定序列的m个不相交子段,使这m个子段的总和达到最大。分析:设b(i,j)表示数组e的前j项中i个子段和的最大值,且第i个子段含e[j](1£ i £m,i£ j £n)。以下称b(i, j)为“最后一个元素属于第i子段的j元素i子段问题”。则n个元素中求i个子段的最优值显然为:best(i, n) = Max{ b(i, j) } (i <= j <= n)计算b(i,j)的最优子结构为:b(i,j) = Max{ b(i, j-1) + e[j], 阅读全文
摘要:
《问题的引出》看下面一个例子,计算三个矩阵连乘{A1,A2,A3};维数分别为10*100 , 100*5 , 5*50按此顺序计算需要的次数((A1*A2)*A3):10X100X5+10X5X50=7500次按此顺序计算需要的次数(A1*(A2*A3)):10X5X50+10X100X50=75000次所以问题是:如何确定运算顺序,可以使计算量达到最小化。枚举显然不可,如果枚举的话,相当于一个“完全加括号问题”,次数为卡特兰数,卡特兰数指数增长,必然不行。《建立递归关系》子问题状态的建模(很关键):令m[i][j]表示第i个矩阵至第j个矩阵这段的最优解。显然如果i=j,则m[i][j]这段 阅读全文
摘要:
http://poj.org/problem?id=1182/********************************************************此道题目 前天看的时候一点头绪都没有,看了他人的解题报告后也几乎看不懂,但是首先做了两道并查集的基础题目POJ1611,与POJ2524,熟悉并查集的结构,又做了两道并查集的拓展题目POJ2492与1703,,在充分了解并可以熟悉运用并查集后,此题便可迎刃而解了,也通过此题发现了自学的诀窍“循序渐进”,刚刚AC掉食物链问题,有些小激动,遂发此感慨,呵呵~~~********************************* 阅读全文
摘要:
http://poj.org/problem?id=1703//POJ 1703 几乎和POJ2492一模一样,不再对并查集的建立做解释//参考POJ2492的注释View Code 1 #include<iostream> 2 usingnamespace std; 3 /**********************************************************/ 4 int p[100010],r[100010]; 5 int T,N,M,a,b; 6 char flag; 7 /************************************ 阅读全文