Area1のif(memo[i][j])スマートフォン用の表示で見るArea1のif(memo[i][j])解いた問題のソースコードと解説など。この広告は、90日以上更新していないブログに表示しています。問題2次元平面上の整数座標がn点(n<=1000)与えられる。4点を選んでできる平行四辺形の個数を求めよ。どの4点も一直線上に並ばないものとする。やりかた3点を指定すると残り1点が定まり、その残りの点が与えられた中にあるかを調べる、というやりかただとTLEしてしまう。2点を指定するとその2点の中点が定まる。このとき別の2点の中点がこの中点と同じだとすると、そこで一つの平行四辺形ができる。個の平行四辺形ができるわけだから、これを足し上げていけばいい。管理したらTLEしたのですこし工夫した。あと、中点は整数になっていてほしいので得られた座標を原点基準で2倍することで必ず中点が整数になるようにしている。長さN(<=1e5)の整数列が与えられる。i+1の要素の符号を反転できる。この操作を任意の回数を行い、操作後の数列の総和を最大化せよ。やりかたまず、もともとの数列にある負の数の個数が偶数個の場合は操作によってすべて正(もしくは0)にできる。奇数個だとどうしても一つ残ってしまうが、操作をうまく行うと、符号がマイナスになる位置を好きに選ぶことができる。数列中で絶対値の最小の要素をマイナスにしてあとはプラスにすればいい。POJ問題n個の荷物とその荷物を目的に運ぶための車が2台ある。荷物の重量はそれぞれw[i]であり、車が一回で運ぶことのできる重量はそれぞれc1,c2までである。2台の車は常に同時に動かすとする。荷物をすべて動かすのに2台の車を最低何回動かせばよいか答えよ。やりかたnが10以下とちいさいのでbitdpでいける。dp[S]を荷物のうち集合Sを運ぶための最小回数とする。dp[S|T|U])という漸化式を解いていく。制限時間が厳しいので、車1と2が運ぶ候補をSとは無関係に全列挙すると間に合わない。運んだ荷物の状態Sの補集合に対する部分集合を列挙して車1が運ぶ候補Tとし、SとTの和集合(すでに運んだ荷物と車1が今回運ぶ荷物)の補集合に対する部分集合を列挙して車2は運ぶ候補Uとした。0;}数日来、気落ちすることが多いので競技プログラミングをして心を落ち着けています。問題0と1からなるnxmのマスが与えられる。この中に含まれる1のみからなるx軸とy軸に平行な長方形で最大の長方形の面積を求めよ。やりかたヒストグラム内の最大長方形の面積を求めるアルゴリズムを応用する。マスから一行読むごとにこのアルゴリズムを実施する。そのときにどれだけy軸方向に1が連続しているかを列ごとに蓄積しておくことで、その値をその行を読んだときのヒストグラムの高さとして考える事ができる。計算量O(nm)以下ソース。DP問題N個の文字があり、各文字の文字数が数値として与えられる。文字は与えられた順に(間にスペースを一つ入れて)連結して出力することができ、一行あたり最大でM文字出力する事ができる。文字の途中で改行してはいけない。出力する各行には(M-行の文字数)の二乗のペナルティが加算され、これらの総和を全体のペナルティとして計算する。全体のペナルティを最小化せよ。やりかたdp[i]:=(i番目の文字までを使ったときのペナルティの最小値)でDP。更新式は]としてで、プログラム上はO(MN)で計算できる。牛がN匹いて、それぞれの牛の牛乳の生産量は異なっている。2匹の牛の牛乳の生産量の大小を表すクエリがM個与えられる。生産量の順番を確定するために必要になる追加のクエリ数を求めよ。あたえられたM個のクエリのうち確定している関係の個数からこれを引いたものが答えになる。M個のクエリをグラフの構造にすると、あるノード(牛)に着目したときにそのノードより小さいノードの個数というのが、その牛より少ない生産量の牛との関係の個数を表す。これをすべてのノードについて計算すれば確定している関係性の個数が判定できる。小さいノードを調べるのは普通に深さ優先でいい。