処理系にはSWI-Prologを用いました.ダウンロードは↓から.
SWI-Prolog's home
入門はこちら.
M.Hiroi's Home Page / Prolog Programming
事実,規則:
fly(X) :- airplane(X).
airplane(jet_plane).
airplane(helicopter).
質問:
?- fly(jet_plane).
YES
?- fly(taro).
NO
こんな感じ.
時間がある時に適当に記事を書く予定です.
fly(X) :- airplane(X).
airplane(jet_plane).
airplane(helicopter).
?- fly(jet_plane).
YES
?- fly(taro).
NO
import java.util.*;
import java.awt.*;
public class Main{
// 単純なループによる実装 O(n^6)
private int count1(int[][] a){
int res=0;
int m=a[0].length;
int n=a.length;
for(int y1=0;y1<n;y1++){
for(int x1=0;x1<m;x1++){
// 始点-(x1, y1)
for(int y2=y1;y2<n;y2++){
for(int x2=x1;x2<m;x2++){
// 終点-(x2, y2)
int c=0;
// (x1, y1)-(x2, y2)から構成される長方形内の1の個数を数える
for(int j=y1;j<=y2;j++)
for(int i=x1;i<=x2;i++)
if(a[j][i]==1)
c++;
// 長方形内のマスが全て1であり
// 長方形の大きさ(=c)が今までの最大値より大きい場合は更新
if(c==(x2-x1+1)*(y2-y1+1))
if(c>res)
res=c;
}
}
}
}
return res;
}
// 動的計画法による実装
private int count2(int[][] a){
int m=a[0].length;
int n=a.length;
int max=0;
LinkedList<Point>[][] lists=(LinkedList<Point>[][])new LinkedList[n][m];;
LinkedList<Point> temp=new LinkedList<Point>();
for(int j=0;j<n;j++)
for(int i=0;i<m;i++)
lists[j][i]=new LinkedList<Point>();
for(int j=0;j<n;j++){
for(int i=0;i<m;i++){
if(a[j][i]==0)
continue;
int up, left;
for(up=0;j-up>=0&&a[j-up][i]==1;up++)
;
for(left=0;i-left>=0&&a[j][i-left]==1;left++)
;
// 上隣=0,左隣=0
if((i==0||a[j][i-1]==0)&&(j==0||a[j-1][i]==0)){
// (1, 1)
lists[j][i].add(new Point(1, 1));
}
// 上隣=0,左隣=1
else if(j==0||a[j-1][i]==0){
// (左方に続く1の個数, 1)
lists[j][i].add(new Point(left, 1));
}
// 上隣=0,左隣=1
else if(i==0||a[j][i-1]==0){
// (1, 上方に続く1の個数)
lists[j][i].add(new Point(1, up));
}
// 上隣=1,左隣=1
else{
for(Point p:lists[j][i-1])
lists[j][i].add(new Point(p.x+1, Math.min(p.y, up)));
for(Point p:lists[j-1][i])
lists[j][i].add(new Point(Math.min(p.x, left), p.y+1));
}
// 重複要素の削除
for(Point p:lists[j][i])
if(!temp.contains(p))
temp.add(p);
lists[j][i].clear();
// qより大きい長方形が存在したらqをリストに追加しない
for(Point q:temp){
for(Point p:temp){
if(q!=p&&q.x<=p.x&&q.y<=p.y){
q=null;
break;
}
}
if(q!=null)
lists[j][i].add(q);
}
temp.clear();
for(Point p:lists[j][i])
max=Math.max(max, p.x*p.y);
}
}
return max;
}
public static void main(String[] args){
int[][] a;
a=new int[50][50];
for(int j=0;j<a.length;j++)
for(int i=0;i<a[0].length;i++)
a[j][i]=(int)(Math.random()*2);
System.out.println("1:"+new Main().count1(a));
System.out.println("2:"+new Main().count2(a));
}
}
SRM | Easy | Normal | Hard |
295 | o | - | - |
296 | o | - | - |
297 | o | - | - |
298 | o | - | - |
350 | o | - | - |
386 | o | - | - |
447 | o | - | - |
451 | o | - | - |
462 | o | - | - |
463 | o | - | - |
464 | o | - | - |
465 | o | - | - |
466 | o | - | - |
469 | o | - | - |
471 | o | - | - |
472 | o | - | - |
473 | o | - | - |
474 | o | - | - |
475 | o | - | - |
476 | o | - | - |
477 | o | - | - |
478 | o | - | - |
479 | o | - | - |
480 | o | - | - |
481 | o | - | - |
482 | o | o | - |
483 | o | - | - |
484 | o | - | - |
485 | o | - | - |
486 | o | - | - |
487 | o | - | - |
503 | - | o | - |
511 | - | o | - |
1 | hello world | 30B |
2 | echo | 31B |
3 | 99 shinichiroes of hamaji | 258B |
4 | example com | 451B |
5 | Smileys Triangle | 63B |
8 | delete blank lines | 37B |
14 | ultimate problem | 19B |
16 | even lines | 40B |
19 | Fibonacci Numbers | 46B |
34 | FizzBuzz | 84B |
48 | 67B |