「AOJ再挑戦116~120」の編集履歴(バックアップ)一覧に戻る
AOJ再挑戦116~120」を以下のとおり復元します。
*問116 Rectangular Searching
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0116
図の中に描ける最大の面積を持つ長方形を探す問題

解法
私はBigO(n^3)のコードしか考え付きませんでした。
osa_kさんのコードがシンプルながらBigO(n^2)なのでAOJで見ておいてください。
http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=496648&tab=2#

私もstackの代わりにmapをつかった解法であと一歩のところまで到達していたのであと一歩という感じでした。
mapから消すのは遅いけどstackは早い、その差が出ました。











*問117 A reward for a Carpenter
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0117
大工が柱を買い付けて戻ってくるまでのコストを最小にする問題。
解法
点の数が少ないグラフなので計算量の多い手抜きコードでも何の問題もありません。
点の数が増えたらダイクストラ法などを使います。

 #include<stdio.h>
 #include<string.h>
 
 int G[21][21];
 
 int calc(int s,int e,int n){
 	int cost[21];
 	memset(cost,-1,sizeof(cost));
 	cost[s]=0;
 	while(1){
 		bool isUpDate=false;
 		for(int i=1;i<=n;i++){
 			if(cost[i]==-1)continue;
 			for(int j=1;j<=n;j++){
  				if(G[i][j]==-1)continue;
 				if(cost[j]==-1 || cost[j]>cost[i]+G[i][j]){
 					cost[j]=cost[i]+G[i][j];
 					isUpDate=true;
 				}
 			}
  		}
 		if(isUpDate==false)break;
 	}
 	return cost[e];
 }
 
 int main(){
  	int n,m,a,b,c,d;
	scanf("%d %d",&n,&m);
  	memset(G,-1,sizeof(G));
 	while(m--){
 		scanf("%d,%d,%d,%d",&a,&b,&c,&d);
 		G[a][b]=c;
 		G[b][a]=d;
 	}
  	int x1,x2,y1,y2;
 	scanf("%d,%d,%d,%d",&x1,&x2,&y1,&y2);
 	printf("%d\n",y1-y2-calc(x1,x2,n)-calc(x2,x1,n));
 }




*問118 Property Distribution
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0118
この問題、数十万行*数十万列のデータになってもコードがBigO(行数*列数*log(列数,2))と列数の要素数の定数倍のメモリ使用量で動くコードを試行錯誤中。
今のところ人様に見せれるコードは書けてないのでコードは誰にも見せてない。

復元してよろしいですか?