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

摘要:刷个简单的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 _雨 阅读(212) 评论(0) 推荐(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 _雨 阅读(284) 评论(0) 推荐(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 _雨 阅读(218) 评论(0) 推荐(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 _雨 阅读(188) 评论(0) 推荐(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 _雨 阅读(198) 评论(0) 推荐(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 _雨 阅读(404) 评论(0) 推荐(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 _雨 阅读(258) 评论(0) 推荐(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 _雨 阅读(358) 评论(0) 推荐(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 _雨 阅读(288) 评论(2) 推荐(0) 编辑
摘要:写了一记忆化 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 _雨 阅读(209) 评论(0) 推荐(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 _雨 阅读(257) 评论(0) 推荐(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 _雨 阅读(271) 评论(0) 推荐(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 _雨 阅读(185) 评论(0) 推荐(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 _雨 阅读(193) 评论(0) 推荐(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 _雨 阅读(643) 评论(0) 推荐(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 _雨 阅读(171) 评论(0) 推荐(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 _雨 阅读(207) 评论(0) 推荐(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 _雨 阅读(236) 评论(0) 推荐(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 _雨 阅读(257) 评论(0) 推荐(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 _雨 阅读(283) 评论(0) 推荐(0) 编辑