动态规划POJ专题

声明:本文属博主原创文章,未经允许请勿转载。

经典题目题号(此处为转载):
容易: 
1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1414, 1456, 1458,

1609, 1644, 1664, 1690, 1699, 1740, 1742, 1887, 1926, 1936, 1952, 1953, 1958, 1959, 1962, 1975, 1989, 2018,

2029, 2039, 2063, 2081, 2082, 2181, 2184, 2192, 2231, 2279, 2329, 2336, 2346, 2353, 2355, 2356, 2385, 2392, 2424, 
不易: 
1019, 1037, 1080, 1112, 1141, 1170, 1192, 1239, 1655, 1695, 1707, 1733(区间减法加并查集),

1737, 1837, 1850, 1920(加强版汉罗塔), 1934(全部最长公共子序列), 1964(最大矩形面积,O(n*m)算法), 2138, 2151, 2161, 2178, 
推荐: 
1015, 1635, 1636(挺好的), 1671, 1682, 1692(优化), 1704, 1717, 1722, 1726, 1732, 1770,

1821, 1853, 1949, 2019, 2127, 2176, 2228, 2287, 2342, 2374, 2378, 2384, 2411

1.POJ 1050 To the Max

【算法分析】最大连续子段和的拓展,枚举行起点与终点,将起点行、终点行中间的数组成的矩阵每列求和,可压缩成一个一维数组,然后分别求最大连续子段和,输出最大答案即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int a[110][110],mat[110],n,ans=-1e8;
 5 int dp(){
 6     int dp[110],t=-1e8;
 7     memset(dp,0,sizeof(dp));
 8     dp[1]=mat[1];
 9     for (int i=2;i<=n;i++)
10     if (dp[i-1]<0) dp[i]=mat[i];
11     else dp[i]=dp[i-1]+mat[i];
12     for (int i=1;i<=n;i++)
13     if (dp[i]>t) t=dp[i];
14     return t;
15 }
16 int main(){
17     scanf("%d",&n);
18     for (int i=1;i<=n;i++)
19     for (int j=1;j<=n;j++) scanf("%d",&a[i][j]);
20     for (int i=1;i<=n;i++)
21     for (int j=i;j<=n;j++){
22         memset(mat,0,sizeof(mat));
23         for (int k=1;k<=n;k++)
24         for (int l=i;l<=j;l++)
25             mat[k]+=a[l][k];
26         int t=dp();
27         if (ans<t) ans=t;
28     }
29     printf("%d",ans);
30     return 0;
31 }

 2.POJ 1088 滑雪

【算法分析】最大上升子序列的二维拓展,用DP+递归求出四个方向的最大序列长度,输出最大答案即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int plus[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
 6 int r,c,map[110][110],len[110][110],ans=0;
 7 int dp(int x,int y){
 8     if (len[x][y]) return len[x][y];
 9     int maxans=0,s;
10     for (int t=0;t<4;t++){
11         int i=x+plus[t][0],j=y+plus[t][1];
12         if (i&&j&&i<=r&&j<=c&&map[i][j]<map[x][y]){
13             s=dp(i,j);
14             if (s>maxans) maxans=s;
15         }
16     }
17     len[x][y]=maxans+1;
18     return len[x][y];
19 }
20 int main(){
21     scanf("%d%d",&r,&c);
22     memset(len,0,sizeof(len));
23     for (int i=1;i<=r;i++)
24     for (int j=1;j<=c;j++)
25         scanf("%d",&map[i][j]);
26     for (int i=1;i<=r;i++)
27     for (int j=1;j<=c;j++){
28         len[i][j]=dp(i,j);
29         if (len[i][j]>ans) ans=len[i][j];
30     }
31     printf("%d",ans);
32     return 0;
33 }

 

时间: 2024-10-04 20:02:58

动态规划POJ专题的相关文章

二分+动态规划 POJ 1973 Software Company

Software Company Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1112   Accepted: 482 Description A software developing company has been assigned two programming projects. As both projects are within the same contract, both must be hande

POJ题目分类推荐 (很好很有层次感)

著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递

专题三 第十二题

1.题目编号:1002 2.简单题意:给出两个子串,依次比较子串得到两个子串相等的字符的最大长度,即最长公共子序列. 3.解题思路形成过程:在动态规划的专题,就想到用动态规划的方法去做,首先要找子问题,假设有两个字符串a=a0,a1,a2,...am-1,b=b0,b1,b2...bn-1.如果am-1==bn-1,则当前最长公共子序列为a0,a1,...am-2与b0,b1,b2...bn-2的最长公共子序列的长度加1:如果am-1!=bn-1,则最长公共子序列为max(a0,a1,...am

POJ 刷题指南

OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递推. 构造法.(POJ 3295) 模拟法.(POJ 1068,POJ 2632,POJ 1573,POJ 2993,POJ 2996) 二

UVALive 3530 Martian Mining

分析: 对于网格grid[i][j]如果放向上的管道,那么grid[i][k], k>j 贪心地放向上的管道. 那么定义dp[i][j]表示第i行,最后一个放向左的管道是j的最大总矿量. j = 0表示全放向上,j = m表示全放向左. 如果grid[i][j]要往放向上的管道的话,前提是grid[i-1][j]也要是向上的管道. 因此转移为dp[i][j] = max(dp[i-1][k]+sumA(1,j)+sumB(j+1,n) ), k >= j 对于N= 500这样的规模,转移有点慢

Acm课程总结

ACM课程总结 一个学期又过去了,这个学期的ACM是我觉得最难的学科,尽管最难,但是我觉得最有用的还是它了,虽然并没有掌握这四个专题,但是在做题的过程中对于思维的锻炼确实是非常有用的,受益匪浅.对于这一篇课程总结,我将从这四个专题去进行总结,这其中有什么不对的地方还望老师予以指正.现在对图的印象最深,先从图说起吧. 图的有关算法 这这个专题里面我们主要是跟图打交道.在整个大二,可以说一直都在和图打交道,离散数学离不开图,数据结构离不开图,acm当然也离不开图.图真的是非常重要啊,它深入到我们生活

poj 动态规划专题练习

http://poj.org/problem?id=2336 大意是要求一艘船将m个车运到对岸所消耗的最短时间和最小次数 定义dp[i][j]运送前i个车,当前船上有j个车所消耗的时间,非常容易得到如下ac代码的推导 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1508; const int INF=0x7f7f7f7f; int d

[POJ 1787]Charlie&#39;s Change (动态规划)

题目链接:http://poj.org/problem?id=1787 题意:有4种货币分别是1元,5元,10元,20元.现在告诉你这四种货币分别有多少个,问你正好凑出P元钱最多可以用多少货币.每种货币要用多少钱. 据说此题有完全背包的写法.. 我是按照多重背包写的,速度也不是很慢. 然后记录了下前驱. 刚开始全都写挫了..虽然现在也很挫.. 凑合着看吧 -- 1 #include <cstdio> 2 #include <algorithm> 3 #include <cst

{POJ}{动态规划}

动态规划与贪心相关: {POJ}{2479}{Maximum Sum} (DP) 摘要: 题意:给定n个数,求两段连续子列的最大和.思路:先从左向右dp,求出一段连续子列的最大和,再从右向左dp,求出两段连续子列的最大和,方法还是挺经典的. {POJ}{1036}{Gansters} (DP) 摘要: 题意:有个伸缩门,门的宽度0~K,每个时间可以伸长或缩短1个单位,有N个流氓,他们在T时刻到达,如果这时门的宽度正好与他们的stoutness相等时,便可获得一定的收入,问最大的收入是多少. 思路