洛谷提高组P1004+1006

Posted 未定_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷提高组P1004+1006相关的知识,希望对你有一定的参考价值。

[NOIP2000 提高组] 方格取数 - 洛谷

题意:有N×N 的方格图,将其中的某些方格中填入正整数,而其他的方格放入0

A
 0  0  0  0  0  0  0  0
 0  0 13  0  0  6  0  0
 0  0  0  0  7  0  0  0
 0  0  0 14  0  0  0  0
 0 21  0  0  0  4  0  0
 0  0 15  0  0  0  0  0
 0 14  0  0  0  0  0  0
 0  0  0  0  0  0  0  0
                         B

某人从图的左上角A点出发,可以向下或向右走,直到到达右下角B点。在走过的路上,可以取走方格中的数(取走后的方格中将变为数字 0)。
已知从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大。

分析:动态规划,4维数组分别记录两条线路的位置坐标即可。

唯一的不足就是用了4重循环,题干给的数据范围比较小,其实应该更优化一点,暂时还不会。

#include<iostream>
using namespace std;
int a[10][10];
int f[10][10][10][10];
int max1(int a,int b,int c,int d)

    int m=max(a,b);
    m=max(m,c);
    m=max(m,d);
    return m;

int main()

    int n,x,y,z;
    cin>>n;
    for(int i=0; i<=n; i++)
        for(int j=0; j<=n; j++)
            a[i][j]=0;
    cin>>x>>y>>z;
    while(x+y+z!=0)
    
        a[x][y]=z;
        cin>>x>>y>>z;
    
    for(int i=1;i<=n;i++)
    
        for(int j=1;j<=n;j++)
        
            for(int h=1;h<=n;h++)
            
                for(int k=1;k<=n;k++)
                
                    if(i!=h&&j!=k)
                    
                        f[i][j][h][k]=max(f[i][j][h][k],(max1(f[i-1][j][h-1][k],f[i-1][j][h][k-1],f[i][j-1][h-1][k],f[i][j-1][h][k-1])+a[i][j]+a[h][k]));
                    
                    else f[i][j][h][k]=max(f[i][j][h][k],(max1(f[i-1][j][h-1][k],f[i-1][j][h][k-1],f[i][j-1][h-1][k],f[i][j-1][h][k-1])+a[i][j]));
                
            
        
    
    cout<<f[n][n][n][n]<<endl;

[NOIP2008 提高组] 传纸条 - 洛谷

分析:和方格取数是一种题型,改一下输入条件和范围就可以了。

(看题干想偏了,想了两种方法,一种是两个二维dp数组,一个记录从小渊到小轩的最大值,路过点标0,然后再记录从小轩回到小渊的最大值,忽略了有去无回的情况,所以不对;另一种四维dp数组,和方格取数一样,不过一个起点在[1][1]另一个在[m][n],实际上还是忽略了有去无回的情况。)

#include<iostream>
using namespace std;
int a[51][51];
int f[51][51][51][51];
int max1(int a,int b,int c,int d)

    int m=max(a,b);
    m=max(m,c);
    m=max(m,d);
    return m;

int maxx=0;
int main()

    int m,n;
    cin>>m>>n;
    for(int i=0; i<=m; i++)
        for(int j=0; j<=n; j++)
            a[i][j]=0;
    for(int i=1; i<=m; i++)
        for(int j=1; j<=n; j++)
            cin>>a[i][j];
    for(int i=1; i<=m; i++)
    
        for(int j=1; j<=n; j++)
        
            for(int h=1; h<=m; h++)//必须从1开始
            
                for(int k=1; k<=n; k++)
                
                    if(i!=h&&j!=k)
                    
                        f[i][j][h][k]=max(f[i][j][h][k],(max1(f[i-1][j][h-1][k],f[i-1][j][h][k-1],f[i][j-1][h-1][k],f[i][j-1][h][k-1])+a[i][j]+a[h][k]));
                    
                    else f[i][j][h][k]=max(f[i][j][h][k],(max1(f[i-1][j][h-1][k],f[i-1][j][h][k-1],f[i][j-1][h-1][k],f[i][j-1][h][k-1])+a[i][j]));
                
            
        
    
    cout<<f[m][n][m][n]<<endl;

以上是关于洛谷提高组P1004+1006的主要内容,如果未能解决你的问题,请参考以下文章

luoguP1004 方格取数(四维DP)

P1006 传纸条(dp)

洛谷1004方格取数

P1006 传纸条 (方格取数dp)

Luogu1006 传纸条 与 Luogu P2045方格取数加强版 (费用流)

洛谷 P1006 传纸条