デイリーアルゴリズム - 44日目

デイリーアルゴリズム

あなたは早起きして、あなたが懸命に働くそれらの時。あなたは夜更かしして、懸命に働くそれらの時。当時は作業のように感じていない場合 - あなたはあまりにも疲れている、あなたは自分自身をプッシュする必要はありません - しかし、あなたはとにかくそれを行います。それは実際には夢です。それは夢です。それは旅だ、目的地ではありません。あなたたちはそれを理解することができればと、何が起こる参照してくださいよと、あなたがあなたの夢を達成しないことを、あなたの夢が叶うません、何か大きな意志です。マンバアウト


あなたが疲れを感じるが、それでも夢を追いかけて、おそらくあなたができない、何があっエンドのプロセスを楽しむために道を気にしないことをするとき、歯に付着していたときに、予備のハードワークを支払うものは、あなたが、訓練する必要はありません成功を夢見たが、後に続く多くの素晴らしいものがあるでしょう。マンバアウト〜

2020年3月30日


今日では、ネットワークが開かなかった一日過ぎ揚げcfQAQ

luogu-P1434 [SHOI2002]スキー

古典的な良いタイトルを再訪

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>

using namespace std;
const int N = 105;

int a[N][N] , f[N][N] , n , m;
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};

bool inmap(int x,int y)
{
	return x >= 1 && x <= n && y >= 1 && y <= m;	
}
int dfs(int x,int y)
{
	if(f[x][y] != 0)return f[x][y];
	int ans = 0;
	for(int i = 0;i < 4 ;i ++)
	{
		int nx = x + dir[i][0];
		int ny = y + dir[i][1];
		if(inmap(nx,ny) && a[x][y] < a[nx][ny])
		{
			ans = max(dfs(nx,ny),ans);
		}
	}
	if(ans == 0)return f[x][y] = 1;
	else return f[x][y] = ans + 1;
}
int main()
{
	cin >> n >> m;
	for(int i = 1;i <= n ;i ++)
	{
		for(int j = 1;j <= m ;j ++)
			scanf("%d",&a[i][j]);
	}
	int ans = 0;
	for(int i = 1;i <= n ;i ++)
	{
		for(int j = 1;j <= n ;j ++)
		{
			if(!f[i][j])
			{
				ans = max(dfs(i , j),ans);
			}
		}
	}
	cout << ans << endl;
	return 0;
} 

luogu-P2196掘る鉱山

たぶん私はそれは私が本当に快適バーストサーチ感じるDPの本質だった実現しなかった
のヒントを:+の写真や思い出が容易なACにあるとして、

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;
const int N = 25;

int n , w[N] , f[N];
bool vis[N];
vector<int> a[N];
int path[N];
// u : 当前 
// 
int ans = 0;
int dfs(int u)
{
	if(f[u] != 0)return f[u];
	int t = 0, cur = 0;
	for(int i = 0;i < a[u].size();i ++)
	{
		int x = dfs(a[u][i]) + w[a[u][i]];
		if(x > t)
		{
			t = x;
			cur = a[u][i];
		} 
	}
	path[u] = cur;
	return f[u] = t;
}

int main()
{
	cin >> n;
	for(int i = 1;i <= n ;i ++)scanf("%d",&w[i]);
	int x = 0;
	for(int i = 1;i <= n - 1;i ++)
	{
		for(int j = i + 1;j <= n;j ++)
		{
			scanf("%d",&x);
			if(x == 1){
				a[i].push_back(j);
			}
		}
	}
	
	int ans = 0, now = 0;
	for(int i = 1;i <= n ;i ++)
	{
		int t = dfs(i) + w[i];
		if(t > ans)
		{
			ans = t;now = i;
		} 
	}
	cout << now << " ";
	while(now <= n)
	{
		if(path[now]){
			cout << path[now] << " ";
			now = path[now];
		}else break;
	}
	cout << endl << ans << endl;
	return 0;
}

おすすめ

転載: www.cnblogs.com/wlw-x/p/12602267.html