結果
| 問題 | No.506 限られたジャパリまん | 
| コンテスト | |
| ユーザー |  0214sh7 | 
| 提出日時 | 2017-04-12 01:30:18 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 72 ms / 2,000 ms | 
| コード長 | 1,407 bytes | 
| コンパイル時間 | 534 ms | 
| コンパイル使用メモリ | 67,504 KB | 
| 実行使用メモリ | 6,944 KB | 
| 最終ジャッジ日時 | 2024-06-28 04:08:31 | 
| 合計ジャッジ時間 | 1,738 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 25 | 
ソースコード
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
#define REP(i,n) for (int i=0;i<(n);i++)
#define MOD 1000000007
int add(int);
bool friends[35]={};
int main(){
	int H,W,K,P;
	int x[35],y[35];
	char N[21][12];
	long long int dp[35][35]={};
	long long int max=0;
	int e=0;
	bool max_friends[35]={};
	cin >> H >> W >> K >> P;
	REP(i,K){cin>>x[i]>>y[i]>>N[i];}
	while(friends[K]==0){
		REP(i,K){e+=friends[i];}
		if(e<=P){
	    	REP(i,H+1){
	    		REP(j,W+1){
	    			dp[i][j]= -1;
	    		}
	    	}
	    	dp[0][0]=1;
	    	REP(i,K){if(friends[i]==0){dp[x[i]][y[i]] = 0;}}
	    	REP(i,H+1){
			    REP(j,W+1){
			    	if(dp[i][j]==-1){
			    	    if(i==0 && dp[0][j-1]!=0){
			    	        dp[i][j]=1;
			    	    }else if(j==0 && dp[i-1][0]!=0){
			    	        dp[i][j]=1;
			    	    }else if(i!=0 && j!=0){
			    	        dp[i][j] = dp[i-1][j]+dp[i][j-1];
			    	    }else{
			    	        dp[i][j]=0;
			    	    }
			    		
				    }   
	    		}
	    	}
	    	//REP(i,H+1){REP(j,W+1){cout<<dp[i][j]<<" ";}cout<<endl;}
	    	if(dp[H][W]>max){
	    		max=dp[H][W];
	    		REP(i,K){max_friends[i]=friends[i];}
	    		//cout << max << endl;
	    	}
    
		}
		e=0;
		add(0);
	}
	cout << max % MOD <<endl;
	REP(i,K){if(max_friends[i]==1){cout<<N[i]<<endl;}}
	return 0;
}
int add(int a){
	if(friends[a]==0){
		friends[a]=1;
	}else{
		friends[a]=0;
		add(a+1);
	}
	return 0;
}
            
            
            
        