Diberikan serangkaian formula seperti ini:
bacb
bcab
cbba
abbc
Berikan algoritme yang menemukan jumlah hasil unik yang bisa Anda dapatkan ketika setiap variabel diganti dengan "0" atau "1" di setiap rumus.
Ada (k!)^2
rumus, masing-masing dengan 2k-1
variabel dan k^2
istilah. Ekspresikan asimptotik Anda dalam hal k
.
Algoritma tercepat menang. Dalam kasus seri, solusi dengan penggunaan memori asimptotik yang lebih rendah akan menang. Jika itu masih seri, pos pertama menang.
Untuk contoh di atas, hasil berikut dapat diperoleh dengan mengganti variabel:
1110, 0110, 1001, 0100, 1000, 0000, 0010, 1101, 1111, 0001, 1011, 0111
Jadi jawaban yang benar adalah 12. Antara lain, 1010
tidak bisa dibuat menggunakan rumus di atas.
Saya telah membuat tiga lagi test case, dengan masing-masing solusi 230 , 12076 dan 1446672 .
a
,b
, ... adalah variabel ? Dan kita selalu memiliki jumlah variabel yang tidak merata? Tidak masalah berapa lama urutan variabelnya, dan berapa banyak formula yang diberikan?Jawaban:
Mathematica, O (k ^ 2 (k!) ^ 2) waktu
Semoga saya menghitung kompleksitas waktu dengan benar. Input adalah daftar formula seperti
{"bacb","bcab","cbba","abbc"}
. Berjalan kurang dari 30 detik untuk setiap test case di komputer saya, tetapi siapa yang peduli dengan waktu absolut?Penjelasan:
&
pada akhirnya menjadikannya fungsi murni, dengan#
merujuk pada argumen pertama,#2
menjadi argumen kedua, dll.Length[*..*]
membutuhkan panjang daftar yang ada di dalamnya.Union@@(*..*)
mengambil daftar yang ada dan menyediakannya sebagai argumen untukUnion
, yang mengembalikan daftar elemen unik di salah satu argumennya.*..*&/@#
mengambil fungsi murni dan memetakannya di atas daftar rumus, sehingga{a,b,c}
menjadi{f[a],f[b],f[c]}
. Perhatikan bahwa dalam fungsi murni bersarang,#n
merujuk ke argumen paling dalam.Fold[*..*&,#,*..*]
mengambil fungsi akumulator, nilai awal, dan daftar, dan kembalif[f[...[f[starting value,l_1],l_2],...],l_n]
.Union[Characters[#]]
mengambil semua karakter dalam rumus saat ini dan mendapatkan semua elemen unik, memberi kita variabel.Flatten[*..*]
meratakan argumennya, sehingga{{{a},b},{{c,{d}}}}
menjadi{a,b,c,d}
.{*..*,*..*}
hanyalah cara untuk menggabungkan dua hasil menggunakan di atasFlatten
.StringReplace[#,#2->"0/1"]
mengambil hasil sebelumnya dan mengembalikannya dengan variabel saat ini diganti dengan salah satu0
atau1
.sumber
k
sebagai variabel dalam waktu Anda? Tetap saja, waktu faktorial! Fiuh!k
." Juga, saya harus melakukanGeneralUtilities`Benchmark
untuk setiap metode yang digunakan.