SRM501 Div1Easy FoxPlayingGame

http://community.topcoder.com/stat?c=problem_statement&pm=11284

1年生 | Aizu Online Judgeを解いた経験からDP解を思いつくも、うまくいかない。しぶしぶ考察すると、「足してから掛けたい」「正負は融通が利くので絶対値を大きくしたい」など思いついたため、全部入れ込んだ。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)

class FoxPlayingGame {
public:
   double theMax( int nA, int nB, int paramA, int paramB ) {
       double scoreA=paramA/1000.0,scoreB=paramB/1000.0;
       double ret1=scoreA*nA;
       double ret2=ret1; for(int i=0;i<nB;i++) ret2*=scoreB;
       // Bの絶対値1未満
       if(abs(scoreB)<1){
           // Aが非負→A*nA
           if(scoreA>=0) return ret1;
           // Aが負
           else{
               // Bが非負→A*nA*(B^nB)
               if(scoreB>=0) return ret2;
               // Bが負→A*nA*B
               return ret1*scoreB;
           }
       }
       // Bの絶対値1以上
       else{
           // Aが非負→A*nA*(B^nB)偶数回
           if(scoreA>=0){
               if(nB%2==0) return ret2;
               else return ret2/scoreB;
           }
           // Aが負
           else{
               // Bが非負→A*nA
               if(scoreB>=0) return ret1;
               // Bが負→A*nA*(B^nB)奇数回
               if(nB%2==1) return ret2;
               else return ret2/scoreB;
           }
       }
    }
};

追記:他人の解法が鮮やかすぎて直視できない