主要是近两天做的题目的一些总结。有两个月左右没有写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;
}