问题 E(2687): 数字三角形III
时间限制: 1 Sec 内存限制: 128 MB题目描述
输入
第1行:1个整数N,表示数字三角形的行数和列数(1 <= N <= 1000)
接下来N行,第i行有i个整数,表示数字三角形
输出
第1行:1个整数,表示问题的最优解
样例输入
(如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
5
0
0 1
0 1 0
1 0 0 0
0 0 0 1 0
样例输出
3
这个是数字三角形的第三版,各位童鞋可以点→_→去看数字三角形I和数字三角形II。
—————————————————分析——————————————————
这道题很像数字三角形I呢,只是求的是总和的个位。怎样才能让总和的各位尽量大呢?我们分析一下:
首先,我们想到的肯定是先把每个数都模一下10,然后像数字三角形I一样做,然而这是错的。
其实正确的思想是这样的:
另开一个f数组,把这个数可能的个位数全存下来。
————————————————代码实现—————————————————
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[1005][1005],f[1005][1005][14];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
f[n][i][a[n][i]]=1;
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;j++)
for(int k=0;k<=9;k++)
if(f[i+1][j][k]||f[i+1][j+1][k])
f[i][j][(k+a[i][j])%10]=1;
for(int i=9;i>=0;i--)
if(f[1][1][i]==1) {printf("%d",i);return 0;}
return 0;
}