Light OJ 1071 Baker Vai (DP)
2016-02-10 13:01
567 查看
题意 :n*m的方格,每个方格有一个权值,问从(1,1)到(n,m)的不相交的两条路径所经过的方格的最大权值和。
解析:很简单,斜着按步数DP。
dp[i][j][k]是走i步后两路径的横坐标分别为j和k的最大权值和。
解析:很简单,斜着按步数DP。
dp[i][j][k]是走i步后两路径的横坐标分别为j和k的最大权值和。
: [code]#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,dp[205][105][105],a[105][105]; int da[4] = {-1,-1,0,0}; int db[4] = {0,-1,0,-1}; int main(){ int i,j,k,cas,T,ax,bx,ay,by; scanf("%d",&cas); for(T = 1;T <= cas;T++){ scanf("%d%d",&n,&m); for(i = 0;i < n;i++) for(j = 0;j < m;j++) scanf("%d",&a[i][j]); if(n < m){ swap(n,m); for(i = 0;i < n;i++){ for(j = 0;j < i;j++) swap(a[i][j],a[j][i]); } } for(i = 0;i < n+m-1;i++){ for(j = 0;j < n;j++)for(k = 0;k < n;k++) dp[i][j][k] = 0; } int l,r; for(i = 1;i < n+m-2;i++){ l = i<n?i:n-1;r = i<m?0:i-m; if(l > r) swap(l,r); for(ax = l;ax <= r;ax++){ for(bx = ax+1;bx <= r;bx++){ ay = i-ax;by = i-bx; for(k = 0;k < 4;k++){ if(ax+da[k]==bx+db[k]||ax+da[k]<0||bx+db[k]<0) continue; dp[i][ax][bx] = max(dp[i][ax][bx], a[ax][ay]+a[bx][by]+dp[i-1][ax+da[k]][bx+db[k]]); } } } } printf("Case %d: %d\n",T,dp[n+m-3][n-2][n-1]+a[0][0]+a[n-1][m-1]); } return 0; }
相关文章推荐
- 217. Contains Duplicate LeetCode
- Codeforces AIM TECT Round#1 B DP
- 【树状数组】2016 BUPT Winter Training #2 D
- 我与小娜(08):人工智能的伟大胜利
- UVA 10617 Again Palindrome
- NSGAIII中的Niche preservation操作
- NSGAIII中的Associate
- AIM Tech Round [div2] C. Graph and String
- 【HDOJ】4317 Unfair Nim
- Matrix Chain Multiplication UVA 442(栈+表达式求值)
- Mina airQQ聊天 服务端篇(二)
- Obtaining Disk Space Information获取磁盘空间信息
- jetbrains
- HDU 3452 Bonsai
- Your project contains error(s)
- YTU 2547: Repairing a Road
- Aireplay-ng的6种攻击模式详解
- 深入理解Aireplay-ng各种攻击及其原理
- 例题6-3 UVA 442 Martrix Chain Multiplication矩阵链乘
- AIM Tech Round (Div. 2) B