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;
}