1 条题解

  • 0
    @ 2023-4-12 18:47:25

    一个普普通通的四维DP,我们用mp[i][j]来储存整张图,f[i1][j1][i2][j2]储存第一次走到(i1,j1)和第二次走到(i2,j2)时的分数,对于相同情况直接加一次得分,否则加两次就行了。

    这道题数据范围实在太水了,所以不用优化,数组开11就行了(doge)

    #include <bits/stdc++.h>
    using namespace std;
    
    int i,l,k,n,m=1;
    int mp[11][11],f[11][11][11][11];
    
    struct point
    {
    	int x,y,nu;
    }p[100];
    signed main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cin>>n;
    	while(1){
    		int a,b,c;
    		cin>>a>>b>>c;
    		if (!a and !b and !c)break;
    		p[m].x=a;
    		p[m].y=b;
    		p[m].nu=c;
    		m++;
    		mp[a][b]=c;
    	}
    	for (int i=1;i<=n;i++){
    		for (int j=1;j<=n;j++){
    			for (int k=1;k<=n;k++){
    				l=i+j-k;
    				if (l<=0)break;
    				f[i][j][k][l]=max(f[i-1][j][k-1][l],
    							max(f[i-1][j][k][l-1],
    							max(f[i][j-1][k-1][l],
    							f[i][j-1][k][l-1])));
    				if (i==k and j==l){
    					f[i][j][k][l]+=mp[i][j];
    				}
    				else {
    					f[i][j][k][l]+=mp[i][j]+mp[k][l];
    				}
    			}
    		}
    	}
    	cout<<f[n][n][n][n];
    	return 0;
    	
    }
    
    • 1

    信息

    ID
    236
    时间
    1000ms
    内存
    64MiB
    难度
    10
    标签
    递交数
    3
    已通过
    3
    上传者