方格取数

1.一维


#include<iostream>  
using namespace std;  
#define n 5  
int dp[n][n];  
  
int sum(int i,int j)  
{  
    return ((i>=0)&&(i<n)&&(j>=0)&&(j<n))?dp[i][j]:0;  
}  
  
int max(int a,int b,int c,int d)  
{  
    return a>b?a:b;    
}  
  
void lattice_get_number(int a[][n])  
{  
    int i,j;   
    for(i=0;i<n;i++)  
    {  
        for(j=0;j<n;j++)  
        {
            dp[i][j]=max(sum(i-1,j),sum(i,j-1))+a[i][j];  
        }  
    }  
}  
  
int main()  
{  
    int a[n][n]={{2,0,8,0,2},      
                 {0,0,0,0,0},      
                 {0,3,2,0,0},      
                 {0,0,0,0,0},      
                 {2,0,8,0,2}};  
    lattice_get_number(a);  
    cout<<dp[n-1][n-1]<<endl;  
    return 0;  
}

2.二维


#include<iostream>
using namespace std;
#define n 5
int dp[n*2-1][n][n];

int sum(int s,int i,int j)
{
    return ((i>=0)&&(i<n)&&(s-i>=0)&&(s-i<n)&&(j>=0)&&(j<n)&&(s-j>=0)&&(s-j<n))?dp[s][i][j]:-1;
}

int max(int a,int b,int c,int d)
{
    int temp=a>b?a:b;
    temp=temp>c?temp:c;
    return temp>d?temp:d;
}

void lattice_get_number(int a[][n])
{
    int i,j,s;
    dp[0][0][0]=a[0][0];
    for(s=1;s<=n*2-2;s++)
    {
        for(i=0;i<n;i++)
        {
            for(j=i;j<n;j++)
            {
                if((s-i>=0)&&(s-i<n)&&(s-j>=0)&&(s-j<n))
                {
                    dp[s][i][j]=max(sum(s-1,i-1,j-1),sum(s-1,i-1,j),sum(s-1,i,j-1),sum(s-1,i,j))+((i==j)?a[i][s-i]:(a[i][s-i]+a[j][s-j]));
                }
            }
        }
    }
}

int main()
{
    int a[n][n]={{2,0,8,0,2},    
                 {0,0,0,0,0},    
                 {0,3,2,0,0},    
                 {0,0,0,0,0},    
                 {2,0,8,0,2}};
    lattice_get_number(a);
    cout<<dp[n*2-2][n-1][n-1]<<endl;
    return 0;
}
3.三维

#include<iostream>
using namespace std;
#define n 5
int dp[n*2-1][n][n][n];

int sum(int s,int i,int j,int k)
{
    return ((i>=0)&&(i<n)&&(s-i>=0)&&(s-i<n)&&(j>=0)&&(j<n)&&(s-j>=0)&&(s-j<n)&&(k>=0)&&(k<n)&&(s-k>=0)&&(s-k<n))?dp[s][i][j][k]:-1;
}

int max(int a,int b,int c,int d,int e,int f, int g,int h)
{
    int t1=a>b?a:b,t2=c>d?c:d;
    t1=t1>t2?t1:t2;
    t2=e>f?e:f;
    t1=t1>t2?t1:t2;
    t2=g>h?g:h;
    return t1>t2?t1:t2;
}

void lattice_get_number(int a[][n])
{
    int i,j,k,s;
    dp[0][0][0][0]=a[0][0];
    for(s=1;s<=n*2-2;s++)
    {
        for(i=0;i<n;i++)
        {
            for(j=i;j<n;j++)
            {
                for(k=j;k<n;k++)
                {
                    if((s-i>=0)&&(s-i<n)&&(s-j>=0)&&(s-j<n)&&(s-k>=0)&&(s-k<n))
                    {
                        dp[s][i][j][k]=max(sum(s-1,i-1,j-1,k-1),sum(s-1,i-1,j-1,k),sum(s-1,i-1,j,k-1),sum(s-1,i-1,j,k),sum(s-1,i,j-1,k-1),sum(s-1,i,j-1,k),sum(s-1,i,j,k-1),sum(s-1,i,j,k));
                        if((i==j)&&(j==k))dp[s][i][j][k]+=a[i][s-i];
                        else if((i==j)&&(j!=k))dp[s][i][j][k]+=a[i][s-i]+a[k][s-k];
                        else if((i!=j)&&(j==k))dp[s][i][j][k]+=a[i][s-i]+a[j][s-j];
                        else dp[s][i][j][k]+=a[i][s-i]+a[j][s-j]+a[k][s-k];
                    }
                }
            }
        }
    }
}
	
int main()
{
    int a[n][n]={{2,0,8,0,2},    
                 {0,0,0,0,0},    
                 {0,3,2,0,0},    
                 {0,0,0,0,0},    
                 {2,0,8,0,2}};
    lattice_get_number(a);
    cout<<dp[n*2-2][n-1][n-1][n-1]<<endl;
    return 0;
}

4.传纸条(NOIP2008)

#include<iostream>  
using namespace std;
#define m 3
#define n 3  
int dp[m+n-1][m][n];  
  
int sum(int s,int i,int j)  
{  
    return ((i>=0)&&(i<m)&&(s-i>=0)&&(s-i<n)&&(j>=0)&&(j<m)&&(s-j>=0)&&(s-j<n))?dp[s][i][j]:-1;  
}  
  
int max(int a,int b,int c,int d)  
{  
    int temp=a>b?a:b;  
    temp=temp>c?temp:c;  
    return temp>d?temp:d;  
}  
  
void pass_note(int a[][n])  
{  
    int i,j,s;  
    dp[0][0][0]=a[0][0];  
    for(s=1;s<=m+n-3;s++)  
    {  
        for(i=0;i<m;i++)  
        {  
            for(j=i+1;j<m;j++)  
            {  
                if((s-i>=0)&&(s-i<n)&&(s-j>=0)&&(s-j<n))  
                {  
                    dp[s][i][j]=max(sum(s-1,i-1,j-1),sum(s-1,i-1,j),sum(s-1,i,j-1),sum(s-1,i,j))+a[i][s-i]+a[j][s-j];
                }  
            }  
        }  
    }
    dp[m+n-2][m-1][m-1]=dp[m+n-3][m-2][m-1]+a[m-1][n-1];
}  
  
int main()  
{  
    int a[m][n]={{0,3,9},      
                 {2,8,5},      
                 {5,7,0}};  
    pass_note(a);  
    cout<<dp[m+n-2][m-1][m-1]<<endl;  
    return 0;  
} 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值