1277:【例9.21】方格取数
用带贪心的dp只能拿八十分!
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 const int N=15; 7 int n,r,c,a[N][N]; 8 int dp(){ 9 int f[N][N],t[N][N]; 10 memset(f,0,sizeof(f)); 11 memset(t,0,sizeof(t)); 12 for(int i=1;i<=n;i++){ 13 for(int j=1;j<=n;j++){ 14 f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j]; 15 if(f[i-1][j]>f[i][j-1])t[i][j]=1;//若来自上面,则为1 16 } 17 } 18 //回溯走过的方格 19 a[1][1]=0; 20 r=c=n; 21 while(r>0&&c>0){ 22 a[r][c]=0; 23 if(t[r][c])r--; 24 else c--; 25 } 26 return f[n][n]; 27 } 28 int main(){ 29 int v,ans; 30 cin>>n; 31 while(cin>>r>>c>>v){ 32 if(!r&&!c&&!v)break; 33 a[r][c]=v; 34 } 35 cout<<dp()+dp(); 36 return 0; 37 }
正确的解法:
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 const int N=15; 7 int n,r,c,a[N][N],f[N][N][N][N]; 8 9 int main(){ 10 int v,ans; 11 cin>>n; 12 while(cin>>r>>c>>v){ 13 if(!r&&!c&&!v)break; 14 a[r][c]=v; 15 } 16 for(int i=1;i<=n;i++) 17 for(int j=1;j<=n;j++) 18 for(int k=1;k<=n;k++) 19 for(int l=1;l<=n;l++){ 20 int tmp1=max(f[i-1][j][k-1][l],f[i][j-1][k][l-1]); 21 int tmp2=max(f[i-1][j][k][l-1],f[i][j-1][k-1][l]); 22 f[i][j][k][l]=max(tmp1,tmp2)+a[i][j]; 23 if(i!=k&&j!=l)f[i][j][k][l]+=a[k][l]; 24 } 25 cout<<f[n][n][n][n]; 26 return 0; 27 }
最后那个if为什么是i!=k&&j!=l而不是i!=k||j!=l?看不懂。。。┭┮﹏┭┮