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?看不懂。。。┭┮﹏┭┮

posted @ 2021-08-21 17:18  Rekord  阅读(529)  评论(3编辑  收藏  举报