Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  1 732
Trenger noe hjelp til et problem:

http://uva.onlinejudge.org/index.php...m&problem=1832

Det er dynamisk programmering det er snakk om, og jeg har problemer med å omgjøre min rekrusive løsning til en itterativ.

#include <iostream>
#include <fstream>
using namespace std;
int values[100];
ofstream fout("game1.out");


int memo[100][100];
int memo2[100][100];


//Rekrusiv versjon
int items(int left, int right,int sum){

if(right < left) return 0;

else {
int L = sum-items(left+1,right,sum-values[left]);
int R = sum-items(left,right-1,sum-values[right]);
memo[left][right] = max(L,R);

return memo[left][right];
}


}


int main(){

int sum = 0;
int sum2[100][100];
int numbers;

ifstream fin("game1.in");

fin >> numbers;

for(int i = 1; i <= numbers; i++){
fin >> values[i];
sum += values[i];

}


//Itterativ versjon (fungerer ikke)
sum2[1][numbers] = 29;

for(int left = 1; left <= numbers; left++)
for(int right = numbers; right >= left; right--){

sum2[left+1][right] = sum2[left][right] - values[left];
sum2[left][right-1] = sum2[left][right] - values[right];

int L = sum2[left][right] - memo2[left+1][right];
int R = sum2[left][right] - memo2[left][right-1];


memo2[left][right] = max(L,R);

}

fout << items(1,numbers,sum) << " " << sum-items(1,numbers,sum) << endl;
cout << memo[1][numbers] << " " << memo2[1][numbers];
cin.get();


cin.get();
}

Er ikke så flink på DP, så all trenings tips hadde vært flott

JEEEEEEEEEEEG KLARTE DEEEEEEEEEEEEEEEET!

Jeg prøvde på noe vilt; å kjøre algoritmen flere ganger. Dermed endte det opp med riktig løsning :---------------)

Bra forskning fra min side :P

#include <iostream>
#include <fstream>
using namespace std;
int values[100];
ofstream fout("game1.out");


int memo[100][100];
int memo2[100][100];


//Rekrusiv versjon
int items(int left, int right,int sum){

if(right < left) return 0;

else {
int L = sum-items(left+1,right,sum-values[left]);
int R = sum-items(left,right-1,sum-values[right]);
memo[left][right] = max(L,R);

return memo[left][right];
}


}


int main(){

int sum = 0;
int sum2[100][100];
int numbers;

ifstream fin("game1.in");

fin >> numbers;

for(int i = 1; i <= numbers; i++){
fin >> values[i];
sum += values[i];

}


//Itterativ versjon (FUNGERER :-) )
sum2[1][numbers] = sum;

for(int i = 1; i <= 100; i++)
for(int left = 1; left <= numbers; left++)
for(int right = numbers; right >= left; right--){

sum2[left+1][right] = sum2[left][right] - values[left];
sum2[left][right-1] = sum2[left][right] - values[right];

int L = sum2[left][right] - memo2[left+1][right];
int R = sum2[left][right] - memo2[left][right-1];


memo2[left][right] = max(L,R);


}


fout << memo2[1][numbers] << " " << sum-memo2[1][numbers] << endl;
cin.get();


cin.get();
}

JEEEEEEEEEEEG KLARTE DEEEEEEEEEEEEEEEET!

Jeg prøvde på noe vilt; å kjøre algoritmen flere ganger. Dermed endte det opp med riktig løsning :---------------)

Bra forskning fra min side :P

#include <iostream>
#include <fstream>
using namespace std;
int values[100];
ofstream fout("game1.out");


int memo[100][100];
int memo2[100][100];


//Rekrusiv versjon
int items(int left, int right,int sum){

if(right < left) return 0;

else {
int L = sum-items(left+1,right,sum-values[left]);
int R = sum-items(left,right-1,sum-values[right]);
memo[left][right] = max(L,R);

return memo[left][right];
}


}


int main(){

int sum = 0;
int sum2[100][100];
int numbers;

ifstream fin("game1.in");

fin >> numbers;

for(int i = 1; i <= numbers; i++){
fin >> values[i];
sum += values[i];

}


//Itterativ versjon (FUNGERER :-) )
sum2[1][numbers] = sum;

for(int i = 1; i <= 100; i++)
for(int left = 1; left <= numbers; left++)
for(int right = numbers; right >= left; right--){

sum2[left+1][right] = sum2[left][right] - values[left];
sum2[left][right-1] = sum2[left][right] - values[right];

int L = sum2[left][right] - memo2[left+1][right];
int R = sum2[left][right] - memo2[left][right-1];


memo2[left][right] = max(L,R);


}


fout << memo2[1][numbers] << " " << sum-memo2[1][numbers] << endl;
cin.get();


cin.get();
}

Det var egentlig ikke overnevnte problem. Det er et problem fra USACO, men jeg klarte det

Her er oppgaven jeg gjorde

A Game
IOI'96 - Day 1
Consider the following two-player game played with a sequence of N positive integers (2 <= N <= 100) laid onto a game board. Player 1 starts the game. The players move alternately by selecting a number from either the left or the right end of the sequence. That number is then deleted from the board, and its value is added to the score of the player who selected it. A player wins if his sum is greater than his opponents.

Write a program that implements the optimal strategy. The optimal strategy yields maximum points when playing against the "best possible" opponent. Your program must further implement an optimal strategy for player 2.

PROGRAM NAME: game1
INPUT FORMAT
Line 1: N, the size of the board
Line 2-etc: N integers in the range (1..200) that are the contents of the game board, from left to right

SAMPLE INPUT (file game1.in)
6
4 7 2 9
5 2

OUTPUT FORMAT
Two space-separated integers on a line: the score of Player 1 followed by the score of Player 2.
SAMPLE OUTPUT (file game1.out)
18 11
Editert posten din og legg koden i "[code]" tagger. Tviler på at noen orker å lese dette uten markup.