NOIP 2008 传纸条 NOIP 2000 方块取数 多线程DP
思路都是一样,建立一个四维dp然后跑一发就完了
当然,也可以像我这么帅的人,降成三维再傻傻的跑一发啦啦啦~
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> #include<memory.h> using namespace std; #define maxn 205 int dp[maxn][maxn][maxn]; int map[maxn][maxn]; int main() { memset(dp,0,sizeof(dp)); memset(map,0,sizeof(map)); int n,x,y,p; cin>>n; while(1) { cin>>x>>y>>p; if(x==0&&y==0&&p==0) break; map[x][y]=p; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { dp[i][j][k]=max(dp[i-1][j][k-1],max(dp[i][j-1][k-1],max(dp[i-1][j][k],dp[i][j-1][k])))+map[i][j]+map[k][i+j-k]; if(i==k) dp[i][j][k]-=map[i][j]; } } } cout<<dp[n][n][n]<<endl; return 0; }