SRM div2 500

一応自分が書いたコード

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

class MovieSeating {
private:
  long long permutation(int n, int r);
public:
  long long getSeatings(int numFriends, vector  hall) {
    int height = hall.size();
    int width = hall[0].length();
    long long sum = 0; //return
    //hall[0][j] , hall[1][j]
    for(int i = 0; i < height; i++) {
      int cnt = 0;
      for(int j = 0; j < width; j++) {
	if(hall[i][j] == '.') {
	  cnt++;
	}
      }
	sum += permutation(cnt, numFriends);
    }
    //hall[j][0], hall[j][1]
    for(int i = 0; i < width; i++) {
      int cnt = 0;
      for(int j = 0; j < height; j++) {
	if(hall[j][i] == '.') {
	  cnt++;
	}
      }
      sum += permutation(cnt, numFriends);
    }
    return sum;
  }

long long MovieSeating::permutation(int n, int r) {
  long long ans = 1;
  if(n < r) return 0;  //eg.)3P5 = 0
  for(int i = n; i > n-r; i--) {
    ans *= i;
  }
  return ans;
}

これでもいいけど、最適化するなら、メモ化して、1~max(width, height)を求めちゃうのもいいかもしれない.

//以下、めんどくさいので、擬似コード
long long dp[max(width, height)]
for[0, sizeof dp)
  dp[i] = permutation(i, numFriends); //メモ化