NYOJ 195 飞翔(DP)
2015-04-07 16:59
260 查看
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=195
这道题如果按照常规的dp, 会发现数组开不下, 并且会很慢, 所以要想另外一种方法。 我们知道如果没有捷径, 最短路径就是(n+m)*100, 但是有捷径的就可以减少两条边,所以我们可以动态规划出最多的捷径个数就可以了。结果就是(m+n-2*ans+sqrt(2)*ans)*100;
这道题如果按照常规的dp, 会发现数组开不下, 并且会很慢, 所以要想另外一种方法。 我们知道如果没有捷径, 最短路径就是(n+m)*100, 但是有捷径的就可以减少两条边,所以我们可以动态规划出最多的捷径个数就可以了。结果就是(m+n-2*ans+sqrt(2)*ans)*100;
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; const int maxn = 1000 + 10; struct point { int x, y; }sa[maxn]; int dp[maxn]; int cmp(point a, point b) { if(a.x == b.x) return a.y < b.y; return a.x < b.x; } int main() { int n, m, k; while(~scanf("%d%d", &n, &m)) { scanf("%d", &k); for(int i = 0; i < k; i++) scanf("%d%d", &sa[i].x, &sa[i].y); sort(sa, sa+k, cmp); memset(dp, 0, sizeof(dp)); dp[0] = 1; int ans = 0; for(int i = 0; i < k; i++) { dp[i] = 1;//自己本身就是一条捷径 for(int j = 0; j < i; j++) if(sa[i].x>sa[j].x && sa[i].y>sa[j].y) dp[i] = max(dp[i], dp[j]+1); ans = max(ans, dp[i]); } printf("%.lf\n", (m+n-2*ans+sqrt(2)*ans)*100); } return 0; }
相关文章推荐
- nyoj195飞翔DP
- NYOJ 195 飞翔
- nyoj 195 飞翔
- nyoj-195 飞翔【动态规划】
- NYOJ-195 飞翔
- nyoj195飞翔(动态规划)
- NYOJ - 飞翔(DP)
- NYOJ 195飞翔(动态规划)
- 【动态规划】NYOJ195 飞翔
- NYOJ 195 飞翔 LIS变形
- 飞翔 nyoj195(贪心or 动态)
- nyoj195 飞翔
- (NYoj 195)飞翔 -- 最长递增子序列
- nyoj--49 开心的小明(dp)
- HDU 2686 / NYOJ 61 DP
- NYOJ 104 最大子矩阵(二维DP)
- nyoj 1189 yougth和他的朋友们 (DP)
- nyoj 460 项链(区间DP)
- NYOJ 飞翔
- nyoj 325 和 nyoj 456【经典dp】