(SPOJ) 1389 - Pedido de Desculpas - Solução
import java.io.*;
import java.util.*;
class Main {
class Desculpa {
int qteCaracteres;
int qteDesculpa;
}
public static void main(String[] args) throws NumberFormatException, IOException {
Main processando = new Main();
processando.processa();
System.exit(0);
}
static int leitor(BufferedReader br) throws NumberFormatException, IOException {
int n;
int resp = 0;
while (true) {
n = br.read();
if (n >= '0' && n <= '9') break;
}
while (true) {
resp = resp*10 + n-'0';
n = br.read();
if (n < '0' || n > '9') break;
}
return resp;
}
int funcao (Desculpa[] desculpa, int[][] tabelaVerificadora, int tamanhoAtual, int qteFrases, int comprimentoCartao, int posicao) {
if (tamanhoAtual > comprimentoCartao) { // passou do limite
return -1000;
}
if (tamanhoAtual == comprimentoCartao) {
return 0;
}
if (posicao == qteFrases) { // já viu tudo
return 0;
}
int resposta = 0;
if (tabelaVerificadora[tamanhoAtual][posicao] > -1) {
return tabelaVerificadora[tamanhoAtual][posicao];
}
else {
resposta = Math.max(resposta, (funcao(desculpa, tabelaVerificadora, tamanhoAtual + desculpa[posicao].qteCaracteres, qteFrases, comprimentoCartao, posicao+1) + desculpa[posicao].qteDesculpa));
resposta = Math.max(resposta, (funcao(desculpa, tabelaVerificadora, tamanhoAtual, qteFrases, comprimentoCartao, posicao+1)));
tabelaVerificadora[tamanhoAtual][posicao] = resposta;
}
return resposta;
}
void processa() throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int comprimentoCartao = leitor(br);
int numFrases = leitor(br);
int contaCasos = 0;
while (comprimentoCartao != 0 || numFrases != 0) {
contaCasos++;
Desculpa[] frases = new Desculpa[numFrases];
for (int i = 0; i < numFrases; i++) {
frases[i] = new Desculpa();
}
for (int i = 0; i < numFrases; i++) {
frases[i].qteCaracteres = leitor(br);
frases[i].qteDesculpa = leitor(br);
}
int[][] tabelaVerificadora = new int[comprimentoCartao][numFrases];
for (int i = 0; i < comprimentoCartao; i++) {
for (int j = 0; j < numFrases; j++) {
tabelaVerificadora[i][j] = -1;
}
}
int resposta = funcao(frases, tabelaVerificadora, 0, numFrases, comprimentoCartao, 0);
bw.write("Teste " + contaCasos + "\n" + resposta + "\n\n");
comprimentoCartao = leitor(br);
numFrases = leitor(br);
}
bw.flush();
bw.close();
return;
}
}
import java.util.*;
class Main {
class Desculpa {
int qteCaracteres;
int qteDesculpa;
}
public static void main(String[] args) throws NumberFormatException, IOException {
Main processando = new Main();
processando.processa();
System.exit(0);
}
static int leitor(BufferedReader br) throws NumberFormatException, IOException {
int n;
int resp = 0;
while (true) {
n = br.read();
if (n >= '0' && n <= '9') break;
}
while (true) {
resp = resp*10 + n-'0';
n = br.read();
if (n < '0' || n > '9') break;
}
return resp;
}
int funcao (Desculpa[] desculpa, int[][] tabelaVerificadora, int tamanhoAtual, int qteFrases, int comprimentoCartao, int posicao) {
if (tamanhoAtual > comprimentoCartao) { // passou do limite
return -1000;
}
if (tamanhoAtual == comprimentoCartao) {
return 0;
}
if (posicao == qteFrases) { // já viu tudo
return 0;
}
int resposta = 0;
if (tabelaVerificadora[tamanhoAtual][posicao] > -1) {
return tabelaVerificadora[tamanhoAtual][posicao];
}
else {
resposta = Math.max(resposta, (funcao(desculpa, tabelaVerificadora, tamanhoAtual + desculpa[posicao].qteCaracteres, qteFrases, comprimentoCartao, posicao+1) + desculpa[posicao].qteDesculpa));
resposta = Math.max(resposta, (funcao(desculpa, tabelaVerificadora, tamanhoAtual, qteFrases, comprimentoCartao, posicao+1)));
tabelaVerificadora[tamanhoAtual][posicao] = resposta;
}
return resposta;
}
void processa() throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int comprimentoCartao = leitor(br);
int numFrases = leitor(br);
int contaCasos = 0;
while (comprimentoCartao != 0 || numFrases != 0) {
contaCasos++;
Desculpa[] frases = new Desculpa[numFrases];
for (int i = 0; i < numFrases; i++) {
frases[i] = new Desculpa();
}
for (int i = 0; i < numFrases; i++) {
frases[i].qteCaracteres = leitor(br);
frases[i].qteDesculpa = leitor(br);
}
int[][] tabelaVerificadora = new int[comprimentoCartao][numFrases];
for (int i = 0; i < comprimentoCartao; i++) {
for (int j = 0; j < numFrases; j++) {
tabelaVerificadora[i][j] = -1;
}
}
int resposta = funcao(frases, tabelaVerificadora, 0, numFrases, comprimentoCartao, 0);
bw.write("Teste " + contaCasos + "\n" + resposta + "\n\n");
comprimentoCartao = leitor(br);
numFrases = leitor(br);
}
bw.flush();
bw.close();
return;
}
}
Comments
Post a Comment