【POJ】1050、1068、3624、3628 、3984 【HDUOJ】2612 题解

主要是近两天做的题目的一些总结。有两个月左右没有写ACM的题了,这两天开始集训,就拿几个【水题】来练练手……果然、手生了(哈哈哈哈哈、原来也不会、哈哈哈哈。好方(huang)啊!!压力山大)

来看这两天的题吧:

POJ 1050 To the Max 【传送门】

给了一个方形矩阵,然后求一个任意形状矩形(最小1*1)加起来和的面积,只需要暴力一遍就可以了。

#include<iostream>
#define INF -999999
#define MAXN 105
using namespace std;

int N;
int a[MAXN][MAXN];
int maxn=INF;

int main(){
	
	int N;
	cin >> N;
	for(int i=0;i<N;i++)
		for(int j=0;j<N;j++)
			cin >> a[i][j];
	
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			int temp=0;
			for(int n=i;n<N;n++)
			{	
				temp=0;		
				for(int m=j;m<N;m++)
				{
					for(int k=i;k<=n;k++)
					{
						temp+=a[k][m];
					}
					//cout << temp << endl;
					maxn=max(temp,maxn);
				}
			}
		}
	}
		
	cout << maxn << endl;
	
	return 0;
}

POJ 1068 Parencodings 【传送门】

题目大意是,一组规则的括号对,形成了两种序列P和W(P:第i个右括号前面有几个左括号;W:第i个右括号到其对应的左括号中间有几个规则的括号),给了P序列让求W序列。直接模拟出来括号就OK了……

#include<iostream>
#include<cstring>
#define MAXN_string 250000
using namespace std;

int main(){
	
	int t;
	cin >> t;
	while(t--)
	{
		int n,q,w;
		char str[MAXN_string];
		int top=0,ans=0,count=0;
		cin >> n;
		for(int i=0;i<n;i++)
		{
			ans=count;
			cin >> q;
			for(int j=0;j<q-ans;j++)
			{
				str[top++]='(';
				count++;
			}
			str[top++]=')';
		}
		count=0;
		for(int i=0;i<top;i++)
		{
			if(str[i]==')')
			{
				int left=0;
				for(int k=i-1;k>=0;k--)
					if(str[k]==')')
						left++;
					else if(str[k]=='(')
						if(left!=0)
						{
							left--;
							continue;
						}
						else{
							cout << (i-k)/2+1;
							count++;
							if(count!=n)
							{
								cout << " ";
							}
							break;
						}
			}	
		}
		//cout << "1";
		cout << endl;
		
	}

	return 0;
}

值得一提的是:这个最后一组答案后面没有空格,POJ也不会提示格式错误……导致我贡献好几次WA!


POJ 3624 Charm Bracelet 【传送门】

一个一模一样的01背包问题……

#include<iostream>
#include<cstring>
#define MAXN 35000
using namespace std;

int N,M;
int W[MAXN],D[MAXN];
int dp[MAXN];

void solve()
{
	for(int i=0;i<N;i++)
	{
		for(int j=M;j>=W[i];j--)
		{
			dp[j]=max(dp[j],dp[j-W[i]]+D[i]);
		}
	}
	cout << dp[M] << endl;
}

int main()
{
	cin >> N >> M;
	for(int i=0;i<N;i++)
		cin >> W[i] >> D[i];
	memset(dp,0,sizeof(dp));
	
	solve();
		
	return 0;
}

POJ 3628 Bookshelf 2 【传送门】

01背包…………

#include<iostream>
#include<cmath>
#define MAXN 30
#define MAXN_DP 2000008
using namespace std;

int n,b;
int cow[MAXN];
int dp[MAXN_DP];
int sum;

void solve()
{
	int ans=0;
	for(int i=0;i<n;i++){
		for(int j=sum;j>=cow[i];j--){
			dp[j]=max(dp[j],dp[j-cow[i]]+cow[i]);
		}
	}
	
	ans=sum;
	for(int i=b;i<=sum;i++)
	{
		if(dp[i]>=b&&dp[i]-b<ans)
			ans=dp[i]-b;
	}
	
	cout << ans << endl;
}

int main()
{
	
	ios::sync_with_stdio(false);
	//minn=INF;
	sum=0;
	cin >> n >> b;
	for(int i=0;i<n;i++)
		cin >> cow[i],sum+=cow[i];
	
	solve();
//	cout << solve(0,b) << endl;
	
	return 0;
}

POJ 3984 迷宫问题  【传送门】

一道很简单的dfs、bfs输出最短路径的题目……

点击【这里】传送到以前写的很详细的BFS输出路径题解、点击【这里】传送到DFS输出路径题解……

这里我用的深搜输出路径……

#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
#include<iostream>
 
using namespace std;
stack<int>s1,s2;
int a[6][6],b[6][6];
int di[4][2]={1,0,0,-1,-1,0,0,1};
int judge(int x,int y)
{
    return x>=0&&x<5&&y>=0&&y<5&&a[x][y]==0&&!b[x][y];
}

int dfs(int x,int y)
{
    if(x==4&&y==4)
    {
        s1.push(x);s2.push(y);
                return 1;
    }
    b[x][y]=1;
    if(judge(x+1,y)&&dfs(x+1,y)||judge(x,y-1)&&dfs(x,y-1)||judge(x,y+1)&&dfs(x,y+1)||judge(x-1,y)&&dfs(x-1,y))
    {
        s1.push(x);s2.push(y);
        return 1;
    }
    else return 0;
    return 0;
}

void print()
{
    while(!s1.empty())
    {
        printf("(%d, %d)\n",s1.top(),s2.top());
        s1.pop();s2.pop();
    }
}


int main()
{
	ios::sync_with_stdio(false);
    int i,j;
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
        scanf("%d",&a[i][j]);
    memset(b,0,sizeof(b));
    dfs(0,0);
    print();
    return 0;
}

HDUOJ  2612 Find a way 【传送门】

BFS…………应用……

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <cstring>
using namespace std;
 
typedef long long ll;
typedef struct node {
    int x, y, s;
};

const int maxn = 2e2 + 10;
const int INF = (1 << 30);
int t, n, m;
int vis[maxn][maxn], res[maxn][maxn][5];
node Y, M;
char mp[maxn][maxn];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1} };

bool check(int x, int y) {
    if(x < 0 || x > n - 1 || y < 0 || y > m - 1 || vis[x][y] || mp[x][y] == '#') {
        return 0;
    }
    return 1;
}
void BFS(node T, int num) {
    queue<node> Q;
    Q.push(T);
    memset(vis, 0, sizeof(vis));
    vis[T.x][T.y] = 1;
    node no, nn;
    while(!Q.empty()) {
        no = Q.front();
        Q.pop();
        if(mp[no.x][no.y] == '@') {
            res[no.x][no.y][num] = no.s;
        }
        for(int i = 0; i < 4; i++) {
            nn.x = no.x + dir[i][0];
            nn.y = no.y + dir[i][1];
            nn.s = no.s + 1;
            if(check(nn.x, nn.y)) {
                vis[nn.x][nn.y] = 1;
                Q.push(nn);
            }
        }
    }
}
int main() {
	
    ios::sync_with_stdio(false);
    while(cin >> n >> m) {
        for(int i = 0; i < n; i++) {
            cin >> mp[i];
            for(int j = 0; j < m; j++) {
                if(mp[i][j] == 'Y') {
                    Y.x = i;
                    Y.y = j;
                    Y.s = 0;
                } else if(mp[i][j] == 'M') {
                    M.x = i;
                    M.y = j;
                    M.s = 0;
                }
            }
        }
        memset(res, 0, sizeof(res));
        BFS(Y, 0);
        BFS(M, 1);
        int ans = INF;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(res[i][j][0] && res[i][j][1]) {
                    ans = min(ans, res[i][j][0] + res[i][j][1]);
                }
            }
        }
        cout << ans * 11 << endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值