随笔分类 - 动态规划--线性dp

摘要:链接13年长沙邀请赛的题,神题意~题意:摘自http://blog.csdn.net/libin56842/article/details/9703457这题题意确实有点难懂,起码对于我这个英语渣渣来说是这样,于是去别人的博客看了下题目意思,归纳起来如下:给出一个长度为n的数列,将其分成若干段,要求... 阅读全文
posted @ 2014-07-03 10:41 _雨 阅读 (171) | 评论 (0) 编辑
摘要:链接这题第一想法是矩阵,不过范围太大了,然后就没有思路了。。之后看到群里的解法,行和列可以分着走,两者是互不影响的,这样就把二维转换成了一维,直接dp求出就可以了。然后再组合相乘一下。 1 #include 2 #include 3 #include 4 #include 5 #include 6... 阅读全文
posted @ 2014-05-25 22:18 _雨 阅读 (133) | 评论 (0) 编辑
摘要:1437记忆化 模拟倒水过程 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 #define N 25612 #define LL long long13 #define INF 0xfffffff14 const double eps = 1e-8;15 const double pi = acos(-1.0);16 const double inf = ~0u>>2;17 bool 阅读全文
posted @ 2014-03-28 16:09 _雨 阅读 (69) | 评论 (0) 编辑
摘要:链接二分时间,在时间内dp[i][j]表示截止到第i个人已经做了j个A最多还能做多少个B#include #include#include#include#include#include#include#include#includeusing namespace std;#define N 200000#define LL long long#define INF 0xfffffffconst double eps = 1e-8;const double pi = acos(-1.0);const double inf = ~0u>>2;int a[55],b[55];int d 阅读全文
posted @ 2014-03-20 19:10 _雨 阅读 (83) | 评论 (0) 编辑
摘要:01背包 加上每次更新解题数目最多 总用时最少 因为要保证用时最少,要先把时长由小到大排序。没排序 WA了几小时。。链接 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace std;12 #define N 101013 #define LL long long14 #define INF 0xfffffff15 const double eps = 1e-8;16 const double. 阅读全文
posted @ 2014-03-15 20:11 _雨 阅读 (86) | 评论 (0) 编辑
摘要:ZOJ 3605大体意思就是 找出随机选了K个交换后 石子在第i个罐子里的概率最大也就是可能的总数最大 这样就可以写出递推方程 dp[i][j][k] += dp[i-1][e][k]; (0 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 #define N 10000012 #define LL long long13 #define INF 0xfffffff14 const double eps = 1e-8; 阅读全文
posted @ 2014-03-08 21:39 _雨 阅读 (206) | 评论 (0) 编辑
摘要:A 直接线段树过的 两遍 貌似大多是标记过的。。注意long long 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define LL long long 9 #define N 100100 10 LL s[N>1; 25 build(l,m,w=r) 56 { 57 if(f) 58 { 59 s[w]+=(r-l+1); 60 l... 阅读全文
posted @ 2014-02-25 21:04 _雨 阅读 (160) | 评论 (0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1933矩形的dp一般挺类似 大的矩形都是由小的推出来的 对于一个长为i 宽为j 的 矩形 分别枚举把这n个给出的小矩形放入里面后 取一个最优值dp[i][j] = max(dp[i][j],dp[i-x][j]+dp[x][j-y],dp[i][j-y]+dp[i-x][y]) 交换小矩形的长宽 再取一次 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #i 阅读全文
posted @ 2014-02-20 10:10 _雨 阅读 (70) | 评论 (1) 编辑
摘要:Problem Statement Vocaloids Gumi, Ia, and Mayu love singing. They decided to make an album composed of S songs. Each of the S songs must be sung by at least one of the three Vocaloids. It is allowed for some songs to be sung by any two, or even all three Vocaloids at the same time. The number of son 阅读全文
posted @ 2014-02-16 20:29 _雨 阅读 (134) | 评论 (0) 编辑
摘要:链接题目大意就相当于 跟你一串字符串 让你截成k段 使总体的值最小想法是递归的 递归太慢 可以转换为递推的这样就有可以推出状态方程 dp[i][j] = max(dp[i][j],dp[i-1][g]+sum[g+1][j]+sum[1][g]-sum[1][j]); dp[i][j]表示总长度为j第i次截的最小值 后面的sum[i][j]表示的就是从i开始作为第一个到j个的花费 o[i][j]保存路径 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #defi. 阅读全文
posted @ 2014-02-15 15:24 _雨 阅读 (164) | 评论 (0) 编辑
摘要:1238这算模拟加记忆化吗 找bug找了2个多小时。。记忆化部分好想 就是字符串处理部分挫了 一个个复制模拟 各种修改查找 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define INF 0xfffffff 9 int dp[110][110],o[110][110]; 10 char s[110][110][110],ss[110]; 11 int len(int x) 12 { 13 int q=0; 14 whi... 阅读全文
posted @ 2014-02-11 13:32 _雨 阅读 (195) | 评论 (0) 编辑
摘要:1495牵扯一点数位 保存数的时候我是按2进制保存的 把1当作0算 把2当作1算 滚动数组dp[i][j][(g*10+j)%n] = min(dp[i][j][(g*10+j)%n],dp[i-1][1][g]*2+j-1,dp[i-1][2][g]*2+j-1) j取1,2 *2+j-1是因为我按二进制算的时限给出的2S就是给我这种毫无优化又笨又戳的代码的 跑了1.39s0xfffffff的范围 是2Y多 还是少用好了 太容易超了 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using name.. 阅读全文
posted @ 2014-02-10 17:46 _雨 阅读 (192) | 评论 (0) 编辑
摘要:1513这题好久之前就看过了,悲催的是当时看题解都没看懂,今天又看了看so easy...n个B里不能出现超过连续k个L的情况 一维递推就可以 两种情况 1、dp[i] += dp[i-1] 在i-1的串后面直接加一个B 2、dp[i]+=dp[i-2]+dp[i-3]+...+dp[i-k-1] 这部分的意思是在串后面补连续1个L 2个L 3个L。。K个L的情况 那补一个L的情况要取决于dp[i-1]里面最后一位为B的个数 正好为dp[i-2],依次可做。 1 import java.text.*; 2 import java.io.*; 3 import java.util.*; 4 im 阅读全文
posted @ 2014-02-10 16:15 _雨 阅读 (74) | 评论 (0) 编辑
摘要:1900二维dp挺好推 dp[i][j] = max(dp[i][j],dp[g][j-1]+o[i][i+1]-o[g][i+1])(i>g>=j-1) dp[i][j]表示第i个站台开放第j次设备 预处理出来通过i-j的人数 包括 i-1~j+1等等的 用o[i][j]表示的没睡好 %>_ 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define LL long long10 int dp[510][510],q[510];11 in 阅读全文
posted @ 2014-02-10 16:09 _雨 阅读 (147) | 评论 (0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2169感觉是有递归思想的 dp[j]表示从1到j分成了i段 最多分成m段 肯定是分的越多越小的 第一重循环为(1,m)dp[j] = min(dp[j],dp[g]+pow(sum[g..j]); 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1010 9 #define INF 0xfff 阅读全文
posted @ 2014-01-18 18:31 _雨 阅读 (78) | 评论 (0) 编辑
摘要:1427题意不太好理解 其它没什么 细心啊 细心 一个0写成了1 WA半天以每个字符是以第一种方式还是第二种方式来D 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 100010 9 char s[N];10 int dp[N][2],o[N][2];11 int judge(char x)12 {13 if(x==' ')14 return 1;15 if(x>='a'&&x=' 阅读全文
posted @ 2013-10-22 12:37 _雨 阅读 (97) | 评论 (0) 编辑
摘要:贡献了一列WA。。数学很神奇啊这个题的关键是怎么才能算尾0的个数 只能相乘 可以想一下所有一位数相乘 除0之外,只有2和5相乘才能得到0 当然那些本身带0的多位数 里面肯定含有多少尾0 就含有多少对2和5这样就知道了 就是求2和5 的对数最少的 一条路 DP就不用说了 递推注意有0的时候的计算 特殊处理一下 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1010 9 #define INF 1e10 10 #define... 阅读全文
posted @ 2013-10-21 17:01 _雨 阅读 (101) | 评论 (0) 编辑
摘要:只有小写字母 那>=2600的直接找单字母串长度大于等于100的就可以了<2600 的dp找最长回文串 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 50010 9 char s[N];10 char pa[2610];11 int dp[2610][2610][2],g,n,o[30];12 void dfs(int ss,int i,int j,int k)13 {14 if(ss==0)15 return ;16 ... 阅读全文
posted @ 2013-10-20 21:44 _雨 阅读 (91) | 评论 (0) 编辑
摘要:1287水DP 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1402 9 int dp[N][N][4];10 char s[N][N];11 int main()12 {13 int i,j,n;14 scanf("%d",&n);15 for(i = 0 ; i >s[i];17 dp[0][0][0] = 1;18 dp[0][n-1][3] = 1;19 for(i = 0 ; i... 阅读全文
posted @ 2013-10-20 20:35 _雨 阅读 (119) | 评论 (0) 编辑
摘要:1346简单dp 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 200010 9 int p[N],dp[N][2];10 int main()11 {12 int i,a,b;13 scanf("%d%d",&a,&b);14 for(i = 1 ; i p[i-1])21 {22 dp[i][0] = min(dp[i-1][1]+1,dp[i-1][0]);23 ... 阅读全文
posted @ 2013-10-20 19:33 _雨 阅读 (65) | 评论 (0) 编辑
摘要:刷个简单的DP缓缓心情1A 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 10010 9 vectorq[N];10 #define LL __int6411 #define INF 1e1012 LL dp[N][4];13 int o[N];14 struct node15 {16 int x,y,d;17 char s[10];18 }p[N];19 int main()20 {21 int i,j,n,m;... 阅读全文
posted @ 2013-10-20 16:58 _雨 阅读 (84) | 评论 (0) 编辑
摘要:经典DPn个鹰蛋 m层楼 刚开始是二分想法 不过当数小于二分的那个值 貌似没发判断dp[i][j] = min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k]) 选择第k层扔 若碎了 就用剩下i-1个鹰蛋来测k-1层 若没碎 就用i个鹰蛋来测上面剩下的j-k层 这样是三重循环 1000^3势必TLE 不过以二分的思想来算 1000层最多只需要10个鹰蛋就可以测出来了 所以当n大于10的时候按10来算就OK了 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7.. 阅读全文
posted @ 2013-10-20 14:40 _雨 阅读 (129) | 评论 (0) 编辑
摘要:这题刚开始理解错题意了 以为只能往右和下走这题挺好的 看题解看了N久啊二维的DP 第一维表示走到第几步 可以画一个正方形 以左上角斜着划线第i步走的点只能是第i条线上的点 而dp的第二维 就表示的第i步可以到达的点的状态另开一个a数组来表示 第i条线上每个字母的状态dp所代表的值就为a与b的差值 以这个来进行选择 进行记忆化确定下一步可以到达的字母的状态 是以当前可达的状态&下一步所要到达的字母的状态 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #d 阅读全文
posted @ 2013-10-20 12:55 _雨 阅读 (106) | 评论 (0) 编辑
摘要:短小精悍的代码dp[i][j] +=dp[k][j-1]*[i-k-1][j-1] i个结点 J层 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL __int64 8 LL dp[40][40]; 9 int main()10 {11 int i,j,k,n,d;12 scanf("%d%d",&n,&d);13 for(i = 0; i <= n ; i++)14 dp[0][i] = 1;15 for(i = 1; 阅读全文
posted @ 2013-10-19 20:39 _雨 阅读 (47) | 评论 (0) 编辑
摘要:1037带点组合的东西吧黑书P257 其实我没看懂它写的嘛玩意儿这题还是挺不错的 一个模糊的思路可能会好想一些 就是大体的递推方程 dp1[][]表示降序 dp2[][]表示升序 数组的含义为长度为i的第一个数为j且相对第一个数为升或降的排列数 当然j肯定要小于等于i的 dp1[i][j] = dp1[i][j]+dp2[i-1][k](k》=1&&k<j)同理 dp2[i][j] = dp2[i][j]+dp1[i-1][k](k>=j&&k<i) 这里是因为dp2[i][j]中的j取不到i(因为后面还要升,就肯定取不到i);这样任务完成了一半了 一定要深刻理解两个dp数组的含义 不然后半部 阅读全文
posted @ 2013-10-18 20:00 _雨 阅读 (52) | 评论 (0) 编辑
摘要:1156求出每个联通块的黑白块数 然后再背包 二维的背包 要保证每个块都得取一个写的有些乱。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 vectored[110]; 9 int x,y,flag,g,f[110],o[110],n,q[110]; 10 int co[110],a[110],b[110],dp[110][110]; 11 int vis[110],p[110][110][2]; 12 void dfs(int u,in... 阅读全文
posted @ 2013-10-15 12:11 _雨 阅读 (195) | 评论 (0) 编辑
摘要:这题纠结好久了 看一神代码 想了N久才明白它的意思dp[i][j]表示放了i个数后和为J的方式有多少种而在算阶层总数的时候 会重一部分 而重的那一部分恰好为小于等于P的长度 所以就直接省了乘长度这一部分 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define LL long long 9 int a[55];10 LL dp[55][55];11 double pp[55];12 int main()13 {14 int i,j,k,n,p;1... 阅读全文
posted @ 2013-10-10 18:13 _雨 阅读 (82) | 评论 (0) 编辑
摘要:Problem Statement The pony Rainbow Dash wants to choose her pet. There are N animals who want to be her pet. Rainbow Dash numbered them 0 through N-1.To help her make the decision, Rainbow Dash decided to organize a relay race for the animals. The race track is already known, and... 阅读全文
posted @ 2013-10-06 14:13 _雨 阅读 (169) | 评论 (0) 编辑
摘要:挺好的dp 因为有一点限制 必须任意去除一个数 总和就会小于另一个总和 换句话来说就是去除最小的满足 那么就都满足所以是限制最小值的背包 刚开始从小到大定住最小值来背 TLE了一组数据 后来发现如果从大到小的话 就不用多加一重for了 前面算的已经记录下来 直接用就OK了 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define LL long long 9 #define N 300001010 LL dp[N],sum[N];11 int a[5... 阅读全文
posted @ 2013-10-05 18:15 _雨 阅读 (131) | 评论 (2) 编辑
摘要:写了一记忆化 TLE了 把double换成long long就过了 double 这么耗时间啊 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 4010 9 #define INF 0xfffffff10 #define LL long long11 double a[N];12 LL dp[N][N],b[N][2];13 int n;14 LL dfs(int i,int r1,int r2,LL ss)15 {16 if(i>.. 阅读全文
posted @ 2013-10-05 13:25 _雨 阅读 (75) | 评论 (0) 编辑
摘要:链接dfs+记忆化 对于当前状态虽然满足和差 但如果搜下去没有满足的情况也是不可以的 所以需要记忆化下 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 char s1[1010],s2[1010]; 8 int dp[1010][1010]; 9 int sum1,sum2;10 int p[2010],n,flag;11 int ss1[1010],ss2[1010];12 int st1[1010],st2[1010];13 int dfs(int x,int y,int v,. 阅读全文
posted @ 2013-09-20 11:58 _雨 阅读 (58) | 评论 (0) 编辑
摘要:链接这题意好难懂 看得迷迷糊糊 想的也迷迷糊糊 后来睡了会突然想到了。。不就是类似以前的矩阵操作从右下角记忆化 大的由小的推来dp[i][j] = max(dp[i-1][j]+s1,dp[i][j-1]+s2) s1 = a[i][g]+..a[i][j] s2 = b[g][j]+..b[i][j] 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[550][550]; 8 int n,m; 9 int a[550][550];10 int b[550][550];. 阅读全文
posted @ 2013-09-17 18:39 _雨 阅读 (117) | 评论 (0) 编辑
摘要:链接状态转移好想 不过有坑 大家都犯的错误 我也会犯 很正常就是锤子可以移到n*n以外 要命的是我只加了5 以为最多不会超过5 WA了N久 才想到 上下两方向都可以到5 所以最多加10以时间和坐标进行DP 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1010 9 #define M 3210 struct node11 {12 int x[N],y[N];13 }f[M][M];14 int o[12][M][M];15 int... 阅读全文
posted @ 2013-09-17 14:59 _雨 阅读 (55) | 评论 (0) 编辑
摘要:链接确实是破题 按复杂度估计怎么着也不能按坐标D 啊网上的代码交上去还TLE 无语了 多次TLE之后终于看到一次WA。。好高兴以横坐标进行DP dp[j] = min(dp[j],dp[2*x[i]-j]+1) 这个2*x[i]-j其实是 j+2*(x[i]-j]) 由当前坐标可以由没跳这个个建筑物i之前的坐标推来限制条件为 (j-x[i])*(j-x[i])+(y[i]-y[1])*(y[i]-y[1])>y[i]*y[i]; 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namesp 阅读全文
posted @ 2013-09-16 20:56 _雨 阅读 (55) | 评论 (0) 编辑
摘要:链接哎。。比赛中一下想到了公共子序 之后思维就被局限了 一直在这附近徘徊 想着怎么优化 怎么预处理。。观看了众多神牛的代码 。。以前觉得自己能写出个记忆化的最长回文长度 还挺高兴的。。。现在觉得好弱因为它是两边一起跑 也就是可以是两段回文子序 所以。。只需要求下1-i i+1-n的最长回文串就可以了 这个是可以在之前求总的时候保留下来的 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[1010][1010]; 8 int a[1010]; 9 int main()10. 阅读全文
posted @ 2013-09-16 11:45 _雨 阅读 (484) | 评论 (0) 编辑
摘要:链接dfs倒着搜 返回的路径不能满足相同的数最多 借鉴了下别人的代码。。先dp出来 再倒着标记一下 然后正回来一定可以满足了dp保存的是最小的不相同数 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 int dp[1010][10010]; 9 char s[1010]; 10 int flag,path[1010],k,m,pp[1010],f[1010][10100]; 11 int main() 12 { 13... 阅读全文
posted @ 2013-09-11 09:21 _雨 阅读 (49) | 评论 (0) 编辑
摘要:链接以前做的题 VJ太水了 数组里面的数可能会小于0 当时没判断 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[100010],w[110],path[110],o,f[110],n,ff[110]; 8 int flag,tw; 9 void dfs(int sw,int v,int u)10 {11 int j,i;12 if(flag) return ;13 path[v] = u;14 if(sw==0)15 {16 ... 阅读全文
posted @ 2013-09-10 11:45 _雨 阅读 (79) | 评论 (0) 编辑
摘要:链接这题卡了挺久了 昨天试着用类似dfs的方法直接TLE在第二组 看了下题解,,发现s1,s2的范围是个幌子。。100位最大的s1900 s28100 觉得s1s2太大不敢开二维。。这样就简单了 类似背包 dp[s1][s2]表示组成s2s2最少的位数 其实就是装进去多少个数字 正好把s1s2装满把DP部分预处理之后放在外面 不然会超时 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 int s1,s2; 9 int dp[920][. 阅读全文
posted @ 2013-09-10 09:43 _雨 阅读 (65) | 评论 (0) 编辑
摘要:链接先初始化一下所有的回文串 再O(n*n)DP输出路径dfs 刚开始存所有回文 ME了 后来发现用不着 改了改了OK了 数据还挺强 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 4010 8 #define INF 0xfffffff 9 int dp[N]; 10 char s[4010]; 11 int path[2][4010],o[4010],q[4010][4010],k; 12 int g,flag,pp[2]; 13 void... 阅读全文
posted @ 2013-09-06 21:35 _雨 阅读 (102) | 评论 (0) 编辑
摘要:这几天扫了一下URAL上面简单的DP 第一题 简单递推1225. Flags 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define LL long long 7 LL dp[50][4]; 8 int main() 9 {10 int i,n;11 scanf("%d",&n);12 dp[1][1] = 1;dp[1][2] = 1;13 for(i =2 ; i 2 #include 3 #include 4 #include 5 #include 6 u... 阅读全文
posted @ 2013-09-06 19:23 _雨 阅读 (125) | 评论 (0) 编辑
摘要:链接dp[i][j] += dp[i-1][j-g];背包吧数据太大了 还是JAVA好用 1 import java.io.*; 2 import java.math.*; 3 import java.text.*; 4 import java.util.*; 5 public class Big { 6 public static void main(String[] args) 7 { 8 Scanner cin = new Scanner (System.in); 9 BigInteger[][] dp;10 dp = n... 阅读全文
posted @ 2013-09-05 10:59 _雨 阅读 (60) | 评论 (0) 编辑
摘要:链接路径麻烦啊 很多细节 倒回去搜一遍卡了一节数据库。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL long long 8 int u,o,path[50010],flag; 9 LL sum[110][510],dp[110][510],f[110][510]; 10 int m,n; 11 void dfs(int u,int v) 12 { 13 if(flag) 14 return ; 15 int i,... 阅读全文
posted @ 2013-09-04 15:07 _雨 阅读 (60) | 评论 (0) 编辑
摘要:链接考查大数 正好拿来学习下JAVA JAVA好高端。。 1 import java.io.*; 2 import java.math.*; 3 import java.text.*; 4 import java.util.*; 5 public class Main 6 { 7 8 public static void main(String[] args) 9 {10 Scanner cin = new Scanner (System.in);11 BigInteger[][] dp;12 int n,k,i,j,g;13... 阅读全文
posted @ 2013-09-04 11:43 _雨 阅读 (164) | 评论 (0) 编辑
摘要:链接简单递推 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL long long 8 LL dp[510][510]; 9 int main()10 {11 int i,j,n,g;12 LL ans=0;13 scanf("%d",&n);14 for(i = 1; i <= n ;i++)15 dp[i][i] = 1;16 for(i = 1; i <= n ;i++)17 {18 ... 阅读全文
posted @ 2013-09-03 20:29 _雨 阅读 (102) | 评论 (0) 编辑
摘要:链接第一道URAL题 简单递推 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL long long 8 LL dp[20][20]; 9 int main()10 {11 int i,j,n,k,g;12 LL ans=0;13 scanf("%d%d",&n,&k);14 for(i = 0 ; i < k ; i++)15 dp[1][i] = 1;16 for(i = 1; i <= n ; i++)17 . 阅读全文
posted @ 2013-09-03 20:01 _雨 阅读 (48) | 评论 (0) 编辑
摘要:链接dp好想 根据它定义的 记忆化下就行路径再dfs一遍 刚开始以为要判空格 所以加了判空格的代码 后来知道不用 。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xffffff 8 int dp[110][110]; 9 char s[110],q[550]; 10 int dfs(int a,int b) 11 { 12 int i,d1,d2 = INF; 13 if(dp[a][b]!=-1) 14 r... 阅读全文
posted @ 2013-08-31 21:27 _雨 阅读 (55) | 评论 (0) 编辑
摘要:链接归属简单树形DP 挺简单的 跟第一道一样 就是我跑偏了题意。。以为要覆盖点 纠结啊 推了N久 推不出啊 然后就郁闷了 打了局游戏 边想边打 实在想不出 看下题解 跑偏了分两种情况D方程见代码 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 2010 8 int f[N]; 9 struct node10 {11 int f,ch,m1,m0,br;12 void init()13 {14 f = m0 =ch = br... 阅读全文
posted @ 2013-08-25 19:23 _雨 阅读 (48) | 评论 (0) 编辑
摘要:链接类似最大矩阵 sum存下 枚举最大就是 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int sum[110][110],o[110][110]; 8 int main() 9 {10 int i,j,n,w,h,a,b;11 while(scanf("%d",&n)&&n)12 {13 scanf("%d%d",&h,&w);14 memset(o,0,sizeof(o));15 memset(s 阅读全文
posted @ 2013-08-25 14:34 _雨 阅读 (52) | 评论 (0) 编辑
摘要:链接真的1A了。。一开始想复杂了 想着补全再删 没想好 后来想到递归 大的回文串是由小的推过来的一直递归下去 对于当前的i,j可以选择保留或者删除 选个最小的 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 2010 8 #define INF 0xfffffff 9 int v[500][2];10 int dp[N][N];11 char s[N];12 int dfs(int i,int j)13 {14 if(i>j) return 0;15 ... 阅读全文
posted @ 2013-08-25 13:47 _雨 阅读 (78) | 评论 (0) 编辑
摘要:简单DP 说是简单 还是推了好一会 推出来觉得好简单保留当前i的最小值 dp[i] = min(dp[i],dp[j]+i-j-1) j 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 char s[5010]; 9 int w[500][500],dp[5010];10 int main()11 {12 int i,j,k,n;13 char a,b;14 while(cin>>s)15 {16 memset... 阅读全文
posted @ 2013-08-25 03:27 _雨 阅读 (51) | 评论 (0) 编辑
摘要:链接通化邀请赛的题 貌似不怎么难记忆化DP 状态方程类似于2维的 只是变成了4维 每次有四种方向去搜 取最棒的判断好边界条件 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int p1[25],p2[25],sum1[25],sum2[25]; 8 int dp[25][25][25][25]; 9 int dfs(int i1,int j1,int i2,int j2)10 {11 if(dp[i1][j1][i2][j2]!=-1)12 return dp[i... 阅读全文
posted @ 2013-08-24 20:48 _雨 阅读 (67) | 评论 (0) 编辑
摘要:我是被这题彻底折腾惨了 。。DP很简单 不用说了 重点是必须按它那个图说来来划分三角形 而不是随便撇下一部分 随便划下一个三角形就可以所以 要判断J是第奇数个点才可以 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp1[210][210],sum[210],dp2[210][210]; 8 char s[210][210]; 9 int main()10 {11 int i,j,n;12 cin>>n;13 for(i = 1; i >s[i];... 阅读全文
posted @ 2013-08-23 23:28 _雨 阅读 (72) | 评论 (0) 编辑
摘要:昨天晚上写的一题 结果USACO一直挂中 今天交了下有一点点的数论知识 背包很好想 就是不好确定上界官方题解:这是一个背包问题。一般使用动态规划求解。一种具体的实现是:用一个线性表储存所有的节点是否可以相加得到的状态,然后每次可以通过一个可以相加得到的节点,通过加上一个输入的数求出新的可以相加得到的点。复杂度是O(N×结果)。但是可以证明结果不会超过最大的两个数的最小公倍数(如果有的话)。参见数论。所以复杂度也是O(Na2),完全可以接受了。判断无限解可以按上面的方法,另外也可以算所有的数的最大公约数。如果不是1,也就是说这些数不互质,那么不被这个最大公约数整除的数一定构造不出来。当 阅读全文
posted @ 2013-08-23 22:30 _雨 阅读 (291) | 评论 (0) 编辑
摘要:简单的01背包 保存下方案总数 其实就是dp[v]值 输出路径dfs一下 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[100010],w[110],path[110],o,f[110],n; 8 void dfs(int sw,int v) 9 {10 int j;11 if(sw==0)12 {13 o = v;14 return ;15 }16 for(j = 1; j >tw;29 ... 阅读全文
posted @ 2013-08-23 15:59 _雨 阅读 (76) | 评论 (0) 编辑
摘要:刚开始理解有点误,想成每步都是最优的 ,结果卡在第六组数据上,,无奈瞧了下别人的 发现自己理解错了,,我看的还是中文翻译。。简单的记忆化 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: game1 5 */ 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace std;12 int a[210],dp[210][210],s[210];13 int find(int i,int j)14 {15 16 if(i==j)17 {1... 阅读全文
posted @ 2013-08-21 15:27 _雨 阅读 (63) | 评论 (0) 编辑
摘要:之前做过一道类似的 国际象棋盘神马的。。统计出以每个1作为右下角的最大正方形 那么以大于二到这个最大值之间为边的正方形都可以以这个为右下角 累加就可以了dp[i][j] = min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1; 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: range 5 */ 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace std;12 int dp[255][255],num[255]... 阅读全文
posted @ 2013-08-21 13:46 _雨 阅读 (72) | 评论 (0) 编辑
摘要:五维DP,听着挺多的,貌似就是挺裸的dp,最近貌似做简单的DP挺顺手。。1Adp[i][j][e][o][g] = min(dp[i][j][e][o][g],dp[i-i1][j-i2][e-i3][o-i4][g-i5]+p[q]) i1,i2...为满足给出的商品数量的值 p[q]为选用当前优惠方案的价格。 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: shopping 5 */ 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace s... 阅读全文
posted @ 2013-08-21 00:10 _雨 阅读 (70) | 评论 (0) 编辑
摘要:DP预处理出来 i位不超过j的个数 然后再进行从小到大找第一个比I大的 然后用I减掉上一个比I小的 剩余的按照之前的方法循环找 知道剩余为0细节挺繁琐的 对照数据改了又改 最后一组数据还超 了int。。 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: kimbits 5 */ 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace std;12 #define LL long long13 LL dp[32][32],kk[32];14 void... 阅读全文
posted @ 2013-08-19 20:12 _雨 阅读 (47) | 评论 (0) 编辑
摘要:链接数据比较小 直接爆了 5重枚举断开的琏 dp[i][j][k] (i-j)区间为第k段 dp[i][j][k] = min(dp[i][j][k],dp[g][i-1][k-1]*s[i][j])(g 2 #include 3 #include 4 #include 5 #include 6 #define INF 100000 7 using namespace std; 8 int a[110],dp1[105][105][15],dp2[55][55][15],s[105][105]; 9 int main()10 {11 int i,j,k,n,g,o,e,aa,b,c;1... 阅读全文
posted @ 2013-08-19 17:04 _雨 阅读 (192) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4649枚举当前状态是0或者是1的概率 其实就枚举1的概率 最后概率乘这个数位运算用得不熟 老出错 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int a[210]; 8 char c[210]; 9 double p[210],dp[210];10 int main()11 {12 int i,j,n,kk=0;13 while(scanf("%d",&n)!=EOF 阅读全文
posted @ 2013-08-17 21:35 _雨 阅读 (50) | 评论 (0) 编辑
摘要:题目链接推了半个下午。。写的三重超时了 加了点单调队列的思想 优化了下过了dp[i][j] 第二组的最右边的人选第J个人 那最左边肯定选第j-1个人 肯定是选相邻的dp[i][j] = min(o,dp[i-1][j-2]+(h[j]-h[j-1])*(h[j]-h[j-1])) 加个变量o保存 到j为止 最优的一个位置 j-2得满足条件 1 #include 2 #include 3 #include 4 #include 5 #define N 5010 6 #define M 3010 7 #define INF 0xfffffff 8 using namespace std; 9 i. 阅读全文
posted @ 2013-08-16 18:44 _雨 阅读 (100) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=1191黑书上P116 想了挺久 没想出来 想推出一公式来着 退不出来。。想偏了 正解:递归 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define INF 0xfffffff 9 #define LL long long10 int dp[20][10][10][10][10];11 int aa[10][10],n;12 int divide(int k,int a,int b,int c,int. 阅读全文
posted @ 2013-08-16 18:33 _雨 阅读 (73) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=1160算水过的吧 四重循环没优化 CZ说爆可过 就爆了dp[i][j] = min(dp[i][j],dp[i-1][g]-s) 第i个点建在第j个村庄上 s 是这个点比上个点少的距离 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1010 9 #define INF 0xfffffff10 int h[N],dp[40][N];11 int main()12 {13 int ... 阅读全文
posted @ 2013-08-15 22:52 _雨 阅读 (75) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4681枚举A串和B串包含C串的区间 枚举区间端点算左右两端最长公共子序 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 1010 8 char s1[N],s2[N],s3[N]; 9 int dp1[N][N],dp2[N][N];10 struct node11 {12 int l,r;13 }p1[N],p2[N];14 int main()15 {16 ... 阅读全文
posted @ 2013-08-15 22:09 _雨 阅读 (72) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=3368追完韩剧 想起这题来了 想用线段树搞定来着 结果没想出来。。然后想RMQ 想出来了算是离散吧 把每个数出现的次数以及开始的位置及结束的位置记录下来 以次数进行RMQ 再特殊处理下区间端点就OK 了WA一次 盯了半小时 原来少了个=号 好吧好吧。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 200005 9 struct node10 {11 int s,e,a;12 ... 阅读全文
posted @ 2013-08-15 00:33 _雨 阅读 (73) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=3264RMQ讲解http://dongxicheng.org/structure/lca-rmq/j = log2Kdp[i][j] = max(dp[i][j-1]+dp[i+(1 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 50005 9 int minz[N][40],maxz[N][40];10 void init(int n)11 {12 int i,j,o = floor(log10(d... 阅读全文
posted @ 2013-08-14 21:24 _雨 阅读 (66) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4669这题各种错误都来了一遍 预处理一下第一个数作为尾数与相邻前面的数组成的数的余数 然后再与后面的结合求余数9 6 4 2 8 因为是个环 可以 9 6 4 2 8 9 6 4 2 8 组合 不过 又不能超N所以先预处理 89 289 4289 64289 的余数 再与后面的组合 删除重复的 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define N 50005 7 #define LL __int64 8 . 阅读全文
posted @ 2013-08-14 17:03 _雨 阅读 (65) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4632TLE了N次 原因居然是取模次数太多了。。! 这数据卡的好紧 还是我写的太搓。。828ms挤过s[i]==s[j]dp[i][j] = dp[i][j-1]+dp[i+1][j]+1;else dp[i][j] = dp[i][j-1]+d[[i+1][j]-dp[i+1][j-1]; 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define mod 10007 7 char s[1010]; 8 int . 阅读全文
posted @ 2013-08-14 14:06 _雨 阅读 (60) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4526额。。七夕快乐哦刚推的时候有点乱 又各种小错误 查了好久。。dp[i][k] = min(dp[i-1][g]+g*t+d,dp[i][k]){(g-k) 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 int ca[111][2],dp[110][110]; 9 int main()10 {11 int t,g,i,j,k,n,s,d;12 cin>... 阅读全文
posted @ 2013-08-13 01:27 _雨 阅读 (116) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4323去年的多校 编辑距离的变形 暴力居然过了 还想了好久别的方法,想得很头疼 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[12][12],kk[1510],num[1010]; 8 char s[1510][12],ss[12]; 9 int main()10 {11 int i,j,k,n,m,t,a,b,o=0,g;12 scanf("%d",&t 阅读全文
posted @ 2013-08-12 19:39 _雨 阅读 (67) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4374去年多校的题 今年才做 不知道这一年都干嘛去了。。DP的思路很好想 dp[i][j] = max(dp[i-1][g]+sum[i][j]-sum[i][g-1],dp[i][j]) abs(g-j) 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 105 8 #define M 10005 9 #define LL __int6410 int a[N][M],que[M];11 int dp[ 阅读全文
posted @ 2013-08-12 14:33 _雨 阅读 (146) | 评论 (1) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1838其实原先不知道这题是DP 我都想不到DP去想了想没思路 看了下题解 经典思路 :第n大的都是由第n-1大的推出来的记录以a(i,j)为右下端所能构成的最大棋盘 若a[i-1][j]和a[i][j-1]都与它不同 而且a[i-1][j-1]与它相同 则dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1 之所以是最小 是因为它要保证能全部构成 如:1011010110100101dp[4][4] 如果可以由dp[3][3]推的话 就错了 应该是由dp[3 阅读全文
posted @ 2013-08-11 22:26 _雨 阅读 (60) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=1088据说这题叫经典记忆化搜索 瞎写了下就过了 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 int a[110][110],dp[110][110]; 9 int find(int i,int j)10 {11 if(dp[i][j])12 return dp[i][j];13 int x=0,y=0,z=0,o=0;14 if(a[i][j]>... 阅读全文
posted @ 2013-08-11 20:33 _雨 阅读 (52) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=2229挺好的一公式。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 1000010 8 #define mod 1000000000 9 long long dp[N];10 int a[N];11 int main()12 {13 int i,j,k,n;14 while(cin>>n)15 {16 memset(dp,0,sizeof(dp));17 ... 阅读全文
posted @ 2013-08-11 17:45 _雨 阅读 (79) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4293这题单拉出来写篇吧 确实不错的一题将每个人说的话 转化一下 可以算出它处在哪个段中 题目就转换成了求不相交的最大段数 注意区间相同的情况 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 struct node 8 { 9 int l,r;10 }p[510];11 int dp[510],w[510][510];12 bool cmp(node a,node b)13 {14 ... 阅读全文
posted @ 2013-08-10 19:31 _雨 阅读 (99) | 评论 (0) 编辑
摘要:补补弱项 全面发展。。从最基础来sdut1299最长上升子序 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[1100]; 8 int a[1100]; 9 int main()10 {11 int i,j,k,n;12 cin>>n;13 for(i =1; i >a[i];16 dp[i] = 1;17 }18 for(i = 1; i a[j])21 {22 dp[i] = max(... 阅读全文
posted @ 2013-08-05 10:56 _雨 阅读 (127) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1501搜了下记忆化搜索是嘛 然后就看到这个题了 不过一不小心看到代码了 代码又那么短 一不小心给记住了 然后看了题也没怎么想这个题比较简单把 也没看出哪里记忆化了 感觉扫了一遍 因为s是s1和s2的和 所以对于s里面的字符要么是s1里的要么是s2里的 若都有 分两种情况去搜 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 char s1[210],s2[210],s[500]; 8 int a[2. 阅读全文
posted @ 2013-08-04 13:45 _雨 阅读 (73) | 评论 (0) 编辑
摘要:对dp很无奈。。枚举所有可能达到的值 dp[i]表示到达i值所用最少的邮票 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: stamps 5 */ 6 #include <iostream> 7 #include<cstdio> 8 #include<cstring> 9 #include<stdlib.h>10 #include<algorithm>11 using namespace std;12 int p[55],dp[2000010];13 bool o[2000010];14 int mai 阅读全文
posted @ 2013-05-28 19:32 _雨 阅读 (43) | 评论 (0) 编辑
摘要:来打个酱油 3.1是最小生成树模板View Code 1 /* 2 ID: shangca 3 LANG: C++ 4 TASK: inflate 5 */ 6 #include <iostream> 7 #include<cstdio> 8 #include<cstring> 9 #include<algorithm>10 #include<stdlib.h>11 using namespace std;12 int c[10010],w[10010],dp[10010];13 int main()14 {15 freopen(&q 阅读全文
posted @ 2013-05-03 21:00 _雨 阅读 (52) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=1836打了一堆 网络连接失败 。。不打了View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<stdlib.h> 5 #include<algorithm> 6 using namespace std; 7 int dp1[1010],dp2[1010],h[1010]; 8 int main() 9 {10 int i,j,k,n;11 double he[1010];12 阅读全文
posted @ 2013-01-29 23:18 _雨 阅读 (49) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=1276第一种解法 http://blog.csdn.net/lyy289065406/article/details/6648102代码View Code 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<stdlib.h> 5 using namespace std; 6 int c[20],w[20],num[20],cc[100010],dp[100010]; 7 int main() 8 { 阅读全文
posted @ 2013-01-29 17:06 _雨 阅读 (67) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=3267对dp没研究 看了看解题报告 还是比较好推的 dp[i] = min{dp[i]-1,dp[j]+i-j-length[k]} 若从J到i包含字典中的单词View Code 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 char word[650][30]; 7 int main() 8 { 9 int i,j,k,n, 阅读全文
posted @ 2012-12-13 17:37 _雨 阅读 (58) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=14212A 之前在实验室写的时候排好了序 没打完 回来重打的时候忘记了排序。。View Code 1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 #include<algorithm> 5 #define INF 0xffffff 6 using namespace std; 7 int w[2011]; 8 __int64 dp[2011][1011]; 9 int main()1 阅读全文
posted @ 2012-09-07 11:07 _雨 阅读 (54) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=10877A。。。。简单的递推 没考虑负数的情况 一直乱改。。View Code 1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 #define INF 0xfffffff 5 using namespace std; 6 long long dp[1011],a[1011]; 7 int main() 8 { 9 int i,j,k,n,m;10 while(scanf("%d&quo 阅读全文
posted @ 2012-09-05 20:50 _雨 阅读 (52) | 评论 (2) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=11601A 破题敲了一个多小时 最长上升子序列和最长下降子序列合起来 并把路径保留下来 题中是可以打乱顺序去找的 先按W上升或S下降排下序 再按最升和最降做View Code 1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 struct node 7 { 8 int w,s,xu; 9 }q[1 阅读全文
posted @ 2012-09-05 20:06 _雨 阅读 (113) | 评论 (0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2368我也不知道 这份代码算不算DP 之前写的那份长长的长长的dp死活过不了 可能太长了 bug就太多了。。这个是根据必须保留的来算哪些可以删除 哪些必须保留3种情况当前这个号的日期是‘-’号,‘+’号直接不能删除 继续循环1、 若比前一个不能删除的(pre)大 也就是它们是同一年份的 如果下一个也就是i+1 的年份比i大 也就是它三是一年份的 或者 i+1的年份比pre小或相等 当前i可以删除。2、若比pre小 不同年份 如果i+1的年份比i 阅读全文
posted @ 2012-08-29 11:34 _雨 阅读 (46) | 评论 (0) 编辑
摘要:http://poj.org/problem?id=1159这题以前见过 不会 今天做比赛又看到 知道自己不会 就没多想 后来CZ说是水题 最长公共子序列 我就开始想想到求正序和逆序的最长公共子序列 不知道对不对 就自己想了几个数据试了一下 都过了 就交了 还真蒙对了 ME了一次 又现学的滚动数组View Code 1 #include <iostream> 2 #include<cstdio> 3 using namespace std; 4 int dp[3][5001]; 5 int main() 6 { 7 int i = 0,j = 0,k,n; 8 char 阅读全文
posted @ 2012-08-18 17:51 _雨 阅读 (79) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3339最短路+01背包以耗油量为V 以pow为价值View Code 1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 using namespace std; 5 #define INF 0x3f3f3f 6 int w[101][101],p[101],pi[101],f[10001]; 7 int main() 8 { 9 int i,j,k,n,m,t,a,b,c,v;10 scanf(& 阅读全文
posted @ 2012-08-12 23:01 _雨 阅读 (63) | 评论 (0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1114初始化为无穷大View Code 1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 #define INF 0xfffffff 5 using namespace std; 6 int main() 7 { 8 int i,j,k,n,t,f[10001],v,p[501],w[501]; 9 scanf("%d", &t);10 while(t--)11 {12 阅读全文
posted @ 2012-08-10 16:34 _雨 阅读 (59) | 评论 (0) 编辑
摘要:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.htmlhttp://dongxicheng.org/structure/knapsack-problems/01背包(ZeroOnePack): 有N件物品和一个容量为V的背包。(每种物品均只有一件)第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]= 阅读全文
posted @ 2012-08-10 14:57 _雨 阅读 (151) | 评论 (0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2080最长公共子序列状态方程if (ci==cj)dp[i][j] = dp[i-1][j-1]+1;elsedp[i][j] = max{dp[i-1][j],dp[i][j-1]};View Code 1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 using namespace std; 5 int main() 6 { 7 阅读全文
posted @ 2012-08-10 14:52 _雨 阅读 (83) | 评论 (0) 编辑
摘要:看了看题 没什么想法 参考着解题报告写的状态方程 dp[i][j] = max{dp[i+1][j],dp[i+1][j+1],dp[i+1][j-1]}View Code 1 #include <stdio.h> 2 #include<string.h> 3 int dp[100001][12]; 4 int max1(int x, int y, int z) 5 { 6 int m = x; 7 if(m<y) 8 m = y; 9 if(m<z)10 m = z;11 return m;12 }13 int main()14 {15 ... 阅读全文
posted @ 2012-07-12 21:32 _雨 阅读 (87) | 评论 (0) 编辑
摘要:导弹拦截系统 随时更新dp[i]的值 满足第i个导弹的高度比第j个高的而且dp[i]<dp[j]+1 就更新dp[i]的值View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int n, i, j, dp[10001], h[10001], min; 6 while(scanf("%d", &n)!=EOF) 7 { 8 for(i = 1 ; i <= n ; i++) 9 {10 scanf("%d" , & 阅读全文
posted @ 2012-07-07 23:00 _雨 阅读 (60) | 评论 (0) 编辑
摘要:这题实在是郁闷 检查了几个小时的错误 十几次runtime 居然是没定义成全局变量m[][]存当前最大的公共子序列m[i][j] = m[i-1][j-1] +1 (x[i] = y[i])elsem[i][j] = max(m[i-1][j],m[i][j-1]);View Code 1 #include<stdio.h> 2 #include<string.h> 3 int m[1001][1001]; 4 char c1[1001], c2[1001]; 5 int main() 6 { 7 int i,j, k1, k2; 8 while(scanf(" 阅读全文
posted @ 2012-07-06 21:09 _雨 阅读 (58) | 评论 (0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1570递归求解View Code 1 #include<stdio.h> 2 #include<string.h> 3 int count = 0; 4 int a[21][21]; 5 int h, w; 6 void road(int m, int n) 7 { 8 int i, j; 9 if(m == 1&&n == w)10 {11 count++;12 return ;13 ... 阅读全文
posted @ 2012-05-09 16:31 _雨 阅读 (65) | 评论 (1) 编辑
摘要:Max SumProblem DescriptionGiven a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.InputThe first line of the input contains an integer T(1<=T<=20) which means the 阅读全文
posted @ 2012-04-13 20:25 _雨 阅读 (124) | 评论 (0) 编辑
摘要:最大子序列和问题问题描述:输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:序列:-2 11 -413 -5 -2,则最大子序列和为20。序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。算法一://穷举法,复杂度O(n^3)long maxSubSum1(const vector<int>& a){ long maxSum = 0; for (int i = 0; i < a.size(); i++) { for (int j = i; j < a.size(); j+ 阅读全文
posted @ 2012-04-12 23:49 _雨 阅读 (135) | 评论 (3) 编辑
摘要:Description把M个同样的苹果放在N个 同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。Input第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。Output对输入的每组数据M和N,用一行输出相应的K。Sample Input17 3Sample Output8递推求解如果m = 1,将一个苹果放在n个盘子里,因为511和151属于同一种方法,所以只有一种放法f(1,n) = 1;如果n = 1,将m个苹果放在1个盘子里,只有一种方 阅读全文
posted @ 2012-03-30 21:25 _雨 阅读 (147) | 评论 (0) 编辑