Time Limit: 1000MS | Memory Limit: Unknown | 64bit IO Format: %lld & %llu |
Description
这道题很精彩运用了DP最原始的思想由最底层推最高层最优取值思想(需要将图形斜过来)但是在考虑数字的时候又需要考虑次数其中包含了一些坐标运算的技巧是一道价值很高的题
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int s[110][110];
int dp[110][110];
void dfs();
int n;
int main()
{
while(scanf("%d", &n),n!=0)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&s[i][j]);
}
}
for(int i=1;i<n;i++)
{
for(int j=1;i+j<=n;j++)
{
s[i][j]+=s[n-j+1][n-i+1];
}
}
dfs();
cout<<dp[1][1]<<endl;
}
return 0;
}
void dfs()
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
dp[i][n-i+1]=1;
}
for(int k=n;k>=2;k--)
{
for(int i=k-1;i>=1;i--)
{
int j=k-i;
if(s[i][j+1]>s[i+1][j])
{
s[i][j]+=s[i+1][j];
dp[i][j]=dp[i+1][j];
}
if(s[i][j+1]<s[i+1][j])
{
s[i][j]+=s[i][j+1];
dp[i][j]=dp[i][j+1];
}
if(s[i][j+1]==s[i+1][j])
{
s[i][j]+=s[i][j+1];
dp[i][j]=(dp[i][j+1]+dp[i+1][j]);
}
dp[i][j]%=1000000009;
}
}
return ;
}