ファーム(DP +簡単なトラブル「バックトラック」)のP2905 [USACO08OPEN]農場の危機危機

実践、質問の簡素化の意味(難易度の決定の長さを参照してください)

そこに二点である(仮称aとb)、それぞれの座標は、現在すべて同時にユニット、点Bと点一致する移動西方向の任意の時点で、答えが芝生に重ねの数を増やします、最大は答えを求め、このコマンドシーケンスを見つけます

ソリューション&&思考

まず、(シリーズをハックそして、貪欲にすることはできません。疑いをDP

第二に、式は良いプッシュ巨人ではありません

F [I] [J] [k]はiは、最も緑、K北が最も比較値、プラス前処理の数の後、4つの転写の合計最大値をとる、東Jを行ったステップを表します難易度。

だから、聞いて2つ目の質問は、これが理由が青になっています。

要件シーケンス!でも最小の辞書順。

Yzyは、引数を押すと同時に、各ポイントに移動するように、シーケンスを求めているが、実現可能ないないようです

最適解は、開始DFSから最適解、マイナスの状態を取得し検討した後、元の状態に復元しようとすると、シーケンス(もdp233)を列挙することを余儀なく

これはDPであるので、あなたが書いた反復処理することができますか?Haoyahaoya ....

列挙方向を列挙するために、E(東)した後、状態いったん我々は、(実際には、これはシミュレーションDFSである)この文字の後、出力を現在の状態に達することができる前処理を見つけるために番号を追加することができます前に。

その後...そして何もありません

ピット:

ここでは、トピックを批判する人々は、単に何の良心を持たないことが必要です。本当にマッピング文ZYMギャングであります

話題の意図、足製データ

それは良いが、ゼロ、それよりも大きいのですか?やる1000未満良いと言いますか?

犬はそれを食べましたか?

しかし、また、抗ネガティブ?

WTF .......

コード:

#include<bits/stdc++.h>
using namespace std;
const int maxn=5005;
const int T=31;
const int dx[4]={1,0,0,-1};
const int dy[4]={0,1,-1,0};
const int dd[4]={69,78,83,87};
int n,m,K;
int a[maxn],b[maxn],c[maxn],d[maxn];
int f[T<<1][T<<1][T<<1];
int g[T<<1][T<<1];
int main()
{
    scanf("%d%d%d",&n,&m,&K);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&c[i],&d[i]);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(abs(c[j]-a[i])+abs(d[j]-b[i])<=K)
            g[c[j]-a[i]+T][d[j]-b[i]+T]++;
        }
    }
    for(int i=K;i>=0;i--)
    {
        for(int j=T-i;j<=T+i;j++)
        {
            for(int k=T-i;k<=T+i;k++)
            {
                for(int l=0;l<4;l++)
                {
                    f[i][j][k]=max(f[i+1][j+dx[l]][k+dy[l]],f[i][j][k]);
                }
                f[i][j][k]+=g[j][k];
            }
        }
    }
    printf("%d\n",f[0][T][T]);
    int u=T,v=T,j;
    for(int i=0;i<K;i++)
    {
        for(j=0;j<4;j++)
        if(f[i][u][v]==f[i+1][u+dx[j]][v+dy[j]]+g[u][v])
        break;
        u+=dx[j];
        v+=dy[j];
        printf("%c",dd[j]);    
    }
    return 0;    
}

(完)

おすすめ

転載: www.cnblogs.com/ajmddzp/p/11374716.html