题目 略
思路:一开始想着直接贪心,写了半天只有20分,,而且不知道哪错了,,于是暴力试一把,,80,分,,于是剪了个枝,过了。
vis数组记录的是走到x时 x的价格和x-1号的价格,因为是从最小开始遍历,所以走过如果没成功就下次不必再走,减掉
边界判断一下(做过前两道的都懂)。p[x-1] = ans[x] + ans[x-1] + ans[x-2] ->在知道x-1与x-2的情况下推出x的范围
#include <bits/stdc++.h>
using namespace std;
#define maxn 333
int n ;
int p[maxn];
int ans[maxn];
int vis[maxn][maxn][maxn];
int dfs( int x )
{
if( x == n && ( ans[n-1] + ans[n-2] ) / 2 == p[n-1] ){
for(int i = 0 ; i < n ; ++i)
printf("%d ",ans[i]);
exit(0);
}
else if( x == n ) {return 0;}
int t = max( p[x-1] * 3 - ans[x-1] - ans[x-2] , 1 );
for(int i = t ; (i + ans[x-1] + ans[x-2]) / 3 == p[x-1] ; ++i)//&& i < p[x]*3*2
{
if( vis[x][i][ ans[x-1] ] )continue;
ans[x] = i;
if( !dfs(x+1) )vis[x][i][ ans[x-1] ] = 1;
}
return 0;
}
int main()
{
cin >> n;
for(int i = 0 ; i < n ; ++i)
cin >> p[i];
for(int i = 1 ; i <= 400 ; ++i)
{
memset(ans,0,sizeof(ans));
ans[0] = i , ans[1] = p[0]*2 - i;
dfs( 2 );
}
}