時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:3 描述
話說有這麼乙個圖形,只有兩種符號組成(『+』或者『-』),圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外(第一層為所有可能情況),每層形狀都由上層決定,相鄰的符號相同,則下層的符號為『+』,反之,為『-』;如下圖所示(n = 3 時的兩種情況):
如果圖中的兩種符號個數相同,那這個三角形就是幸運三角形,如上圖中的圖(2).
輸入
有多組測試資料(少於20組)。
每行含乙個整數n(0輸出
輸出相應的幸運三角形個數。
樣例輸入
3樣例輸出4
46
這個題目有點坑。。。 我用dfs做超時。。。 然後很多人都是打表過的,從網上找了一段可以過得**。。。。
這是大神的**:
#include"iostream"
#include#include#includeusing namespace std;
typedef unsigned char uchar;
//char cc[2]=; //便於輸出
int n, //第一行符號總數
half, //全部符號總數一半
counter; //1計數,即 '-' 號計數
char **p; //符號儲存空間
long sum; //符合條件的三角形計數
//t,第一行第 t個符號
void backtrace(int t)
if( (counter <= half) && ( t*(t+1)/2 - counter <= half) )//若符號統計未超過半數,並且另一種符號也未超過半數
backtrace(t+1); //在第一行增加下乙個符號
//回溯,判斷另一種符號情況
for(j=2; j<=t; ++j)
counter -= p[j][t-j+1];
counter -= i;}}
}int main()
backtrace(1);
}
printf("%d\n", sum);
}return 0;
}
下面是我的**。。。超時。。。
#include #include #include #include using namespace std;
int m, count, map[20][20], sum,a = 0;
int judge();
void dfs(int cur);
int main()
map[0][cur] = 1;
a++;
dfs(cur + 1);
map[0][cur] = 0;
a--;
dfs(cur + 1);
}
幸運三角形
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述話說有這麼乙個圖形,只有兩種符號組成 或者 圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外 第一層為所有可能情況 每層形狀都由上層決定,相鄰的符號相同,則下層的符號為 反之,為 如下圖所示 n 3 時的...
幸運三角形
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 話說有這麼乙個圖形,只有兩種符號組成 或者 圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外 第一層為所有可能情況 每層形狀都由上層決定,相鄰的符號相同,則下層的符號為 反之,為 如下圖所示 n 3 時...
NYOJ 幸運三角形
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述話說有這麼乙個圖形,只有兩種符號組成 或者 圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外 第一層為所有可能情況 每層形狀都由上層決定,相鄰的符號相同,則下層的符號為 反之,為 如下圖所示 n 3 時的...