USACO 2.3 ;零的数列
题目:https://www.luogu.org/problemnew/show/P1473
一开始上手dfs没什么思路,硬刚了一会儿才刚出来我真是太菜了orz
dfs(pos,cur,v,c),用cur表示当前和,v表示上一位
为什么要表示上一位的和呢?因为如果有“ ” ,是要由上一位×10再加当前位得到这个数
cal表示前一位的运算符,也是同理
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; inline int read() { int ans = 0,op = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') op = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { (ans *= 10) += ch - '0'; ch = getchar(); } return ans * op; } char ans[10]; int n; int a[10]; void dfs(int pos,int cur,int v,char cal) { if(pos == n + 1) { if(cal == '-') cur -= v; if(cal == '+') cur += v; if(cur) return; cout << 1; for(int i = 1;i <= n;i++) cout << ans[i] << a[i]; cout << endl; return; } ans[pos] = ' '; dfs(pos + 1,cur,v * 10 + a[pos],cal); ans[pos] = '+'; if(cal == '+') dfs(pos + 1,cur + v,a[pos],ans[pos]); else dfs(pos + 1,cur - v,a[pos],ans[pos]); ans[pos] = '-'; if(cal == '+') dfs(pos + 1,cur + v,a[pos],ans[pos]); else dfs(pos + 1,cur - v,a[pos],ans[pos]); } int main() { n = read(); n--; for(int i = 1;i <= n;i++) a[i] = i + 1; dfs(1,0,1,'+'); return 0; }