(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;
    }
}

Comments

Popular posts from this blog

(Coderbyte) Dash Insert II - Solução

(Coderbyte) Run Length - Solução

(Coderbyte) Counting Minutes I - Solução