Ik zit een opgave van het Nederlands Kampioenschap Programmeren te maken (van vorig jaar).
De opgave luidt simpel gezegd als volgt: Schrijf een algoritme dat als input een string krijgt en als output het minimaal aantal letters geeft dat je weg moet laten om een palindroom te vormen.
voorbeeld: "Programmeerwedstrijd" geeft als output 14. Het langste palindroom hierin is 'rrmmrr' of 'rreerr'. Een palindroom hoeft dus geen bestaand woord te zijn, en hoeft ook niet aaneengesloten te staan.
Ik heb een werkend algoritme geschreven. Dit krijgt als input een string en de lengte van deze string (zodat ik hem niet telkens hoef uit te rekenen), en geeft als output de lengte van het langste te maken palindroom.
Mijn probleem is dat het een complexiteit heeft van 2^n ofzo. Volgens de opgave is de invoer een string van 200 tekens. Tot 100 tekens geeft mijn manier een oplossing binnen een seconde. Bij 120 tekens is ie echter al zo een halve minuut of zoiets gemiddeld. Met 200 tekens is hij denk ik niet klaar voordat mijn achterkleinkinderen bejaard zijn.
Mijn uitdaging is dus het schrijven van een sneller algoritme.
Heeft iemand ideeën?
NB: Het gebruik van java of pascal ipv c/c++ is ook toegestaan.
De opgave luidt simpel gezegd als volgt: Schrijf een algoritme dat als input een string krijgt en als output het minimaal aantal letters geeft dat je weg moet laten om een palindroom te vormen.
voorbeeld: "Programmeerwedstrijd" geeft als output 14. Het langste palindroom hierin is 'rrmmrr' of 'rreerr'. Een palindroom hoeft dus geen bestaand woord te zijn, en hoeft ook niet aaneengesloten te staan.
Ik heb een werkend algoritme geschreven. Dit krijgt als input een string en de lengte van deze string (zodat ik hem niet telkens hoef uit te rekenen), en geeft als output de lengte van het langste te maken palindroom.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| char *paling(char *p, int begin, int eind) { char *c; c = (char *) malloc(sizeof(char) * (eind-begin+1)); strncpy(c,(p+begin),eind-begin); c[eind-begin]=0; return c; } int palindroom(char *p, int leng) { int pos, max; int terug1=0; int terug2=0; char *a; if (leng==0) return 0; if (leng==1) return 1; pos = strrchr(p, p[0]) - p; if (pos) { a = paling(p,1,pos); terug1 = 2 + palindroom(a,pos-1); free(a); } if (pos!=leng-1) { a = paling(p,1,leng); terug2 = palindroom(a,leng-1); free(a); } if (terug1>terug2) max=terug1; else max=terug2; if (max<1) max=1; return max; } |
Mijn probleem is dat het een complexiteit heeft van 2^n ofzo. Volgens de opgave is de invoer een string van 200 tekens. Tot 100 tekens geeft mijn manier een oplossing binnen een seconde. Bij 120 tekens is ie echter al zo een halve minuut of zoiets gemiddeld. Met 200 tekens is hij denk ik niet klaar voordat mijn achterkleinkinderen bejaard zijn.
Mijn uitdaging is dus het schrijven van een sneller algoritme.
Heeft iemand ideeën?
NB: Het gebruik van java of pascal ipv c/c++ is ook toegestaan.
Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life - Terry Pratchett
ik ben echt aan vakantie toe geloof ik... mijn fout