# bzoj1653 [Usaco2006 Feb]Backward Digit Sums

## Description

FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single number is left. For example, one instance of the game (when N=4) might go like this: 3 1 2 4 4 3 6 7 9 16 Behind FJ's back, the cows have started playing a more difficult game, in which they try to determine the starting sequence from only the final total and the number N. Unfortunately, the game is a bit above FJ's mental arithmetic capabilities. Write a program to help FJ play the game and keep up with the cows.

## Input

* Line 1: Two space-separated integers: N and the final sum.

## Output

* Line 1: An ordering of the integers 1..N that leads to the given sum. If there are multiple solutions, choose the one that is lexicographically least, i.e., that puts smaller numbers first.

4 16

## Sample Output

3 1 2 4

OUTPUT DETAILS:

There are other possible sequences, such as 3 2 1 4, but 3 1 2 4
is the lexicographically smallest.

#include<cstdio>
int n,a;
int f;
inline int max(int a,int b)
{return a>b?a:b;}
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
n=read();
for (int i=1;i<=n;i++)a[i]=read();
for (int i=1;i<=n;i++)f[i][i]=n*a[i];
for (int i=n;i>=1;i--)
for (int j=1;j<=n-i;j++)
f[i][i+j]=max(f[i+1][i+j]+a[i]*(n-j),f[i][i+j-1]+a[i+j]*(n-j));
printf("%d",f[n]);
}

07-31 36                                                                          09-11 295
03-15 279
01-15 24
05-07 24
09-07 20
09-18 32
12-18 94
12-24 1642
09-07 69
08-23 2689
12-20
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客