zoj DP(二)

zoj1107

#include <stdio.h>
#include <string.h>
 
int n, k;
int grid[105][105];
int mem[105][105];
 
int memSearch(int r, int c)
{
	int r1, c1, i;
	int max = 0;
	if(mem[r][c] != -1) return mem[r][c];
	for(i = 1;i <= k;i++){
		r1 = r - i;
		if(r1 >= 1 && r1 <= n && grid[r][c] < grid[r1][c]){
			mem[r1][c] = memSearch(r1, c);
			if(mem[r1][c] > max) max = mem[r1][c];
		}
		r1 = r + i;
		if(r1 <= n && r1 >= 1 && grid[r][c] < grid[r1][c]){
			mem[r1][c] = memSearch(r1, c);
			if(mem[r1][c] > max) max = mem[r1][c];
		}
		c1 = c - i;
		if(c1 >= 1 && c1 <= n && grid[r][c] < grid[r][c1]){
			mem[r][c1] = memSearch(r, c1);
			if(mem[r][c1] > max) max = mem[r][c1];
		}
		c1 = c + i;
		if(c1 <= n && c1 >= 1 && grid[r][c] < grid[r][c1]){
			mem[r][c1] = memSearch(r, c1);
			if(mem[r][c1] > max) max = mem[r][c1];
		}
	}
	return max + grid[r][c];
}

int main()
{
	int i, j;
	while(scanf("%d%d", &n, &k)){
		if(n == -1 && k == -1) break;
		for(i = 1;i <= n;i++)
			for(j = 1;j <= n;j++)
				scanf("%d", &grid[i][j]);
		memset(mem, -1, sizeof(mem));
		printf("%d\n", memSearch(1, 1));
	}
	return 0;
}


zoj1108

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

struct mouse { 
	int weight, speed, id; 
} mice[1001]; 

int cmp(const void * a, const void * b)
{
	mouse* ta = (mouse*) a;
	mouse* tb = (mouse*) b;
	if(ta -> weight == tb -> weight)
		return tb -> speed - ta -> speed;
	return ta -> weight - tb -> weight;
}
 
void output(int path[], int pos)
{
	if(pos == 0) return;
	output(path, path[pos]);
	printf("%d\n", mice[pos].id);
}

int main()
{
	int n = 1;   
	while(scanf("%d%d", &mice[n].weight, &mice[n].speed)!=EOF)
	{
		mice[n].id = n;
		n++;
	}
	qsort(mice, n, sizeof(mouse), cmp);
	int count[1001] = {0};
	int path[1001] = {0};
	count[1] = 1;
	for(int i = 2; i < n; i++)
	{
		for(int j = 1; j < i; j++)
			if(mice[i].weight > mice[j].weight && mice[i].speed < mice[j].speed)
				if(count[i] < count[j])
				{
					count[i] = count[j];
					path[i] = j;
				}
		count[i]++;
	}
	
	int max = 0;
	int pos;
	for(int i = 1; i < n; i++)
		if(count[i] > max)
		{
			max = count[i];
			pos = i;
		}
	printf("%d\n", max);
	output(path, pos);
	return 0;
}

zoj1132

#include <stdio.h>
#include <memory.h>

int C,T;
struct {
	int time, city;
} change[1000][100];
char name[100][100];
int start, dist;
int train[1000];
int travel[100];

int search (char *cityName)
{
	int i;
	for (i = 0; i<C; i++)
		if (!strcmp(name[i], cityName))
			return i;
	return -1;
}

void solve(int departure)
{
	int i,j,k;
	for (i = 0; i<C; i++)
		travel[i] = 1000000;
	travel[start] = departure;
	for (k = 0; k<C; k++)
		for (i = 0; i<T; i++)
			for (j = 0; j<train[i]-1; j++)
				if (change[i][j].time>=travel[change[i][j].city] 
					&& travel[change[i][j+1].city]>change[i][j+1].time)
					travel[change[i][j+1].city] = change[i][j+1].time;
	for (i = 0; i<C; i++)
		if (i!=dist)
			travel[i] = -1;

	for (k = 0; k<C; k++)
		for (i = 0; i<T; i++)
			for (j = 0; j<train[i]-1; j++)
				if (change[i][j+1].time<=travel[change[i][j+1].city] 
					&& travel[change[i][j].city]<change[i][j].time)
					travel[change[i][j].city] = change[i][j].time;
}

int main()
{
	int i,j;
	char str[1000];
	int departure;
	int iCase = 0;

	while (scanf("%d",&C) && C)
	{
		for (i = 0; i<C; i++)
			scanf("%s", name[i]);
		scanf("%d",&T);
		for (i = 0; i<T; i++)
		{
			scanf("%d", &train[i]);
			for (j = 0; j<train[i]; j++)
			{
				scanf("%d%s", &change[i][j].time, str);
				change[i][j].city = search(str);
			}
		}
		scanf("%d",&departure);
		scanf("%s",str);
		start = search(str);
		scanf("%s",str);
		dist = search(str);
		
		solve(departure);

		printf("Scenario #%d\n",++iCase);
		if (travel[dist]<1000000)
		{
			printf("Departure %.4d %s\n",travel[start],name[start]);
			printf("Arrival   %.4d %s\n\n",travel[dist],name[dist]);
		}
		else
			printf("No connection\n\n");
	}
	return 0;
}


zoj1147

#include <stdio.h>
#include <string.h>

#define MAXN 1000
#define MAXM 60
const int INF = 999999999;
char word[MAXN][MAXM];
int width;
int len[MAXN];
int line[MAXN];

void DP(int num) {
	int i, j;
	int badness[MAXN];
	badness[num] = 0;
	for(i = num - 1; i >= 0; i--) {
		line[i] = 1;
		j = 1;
		int total = 0;
		int min = INF;
		while(i+j-1 < num && total+len[i+j-1]+j-1 <=width) {
			total += len[i+j-1];
			int score = badness[i + j];
			if (j==1) score += 500;
			else {
				int q = (width - total) / (j-1);
				int r = (width - total) % (j-1);
				score += r*q*q + (j-1-r)*(q-1)*(q-1);
			}
			if(score <= min) {
				min = score;
				line[i] = j;
			}
			j++;
		}
		badness[i] = min; 
	}
}

int main()
{
	int i, j;
	char ch[500];
	while(scanf("%d\n", &width) && width) {
		int word_num = 0;
		while(gets(ch) && strlen(ch)) {
			int pos = 0;
			while(ch[pos]) {
				sscanf(ch+pos, "%s", word[word_num]);
				len[word_num] = strlen(word[word_num]);
				pos += strlen(word[word_num++]);
				while (ch[pos] && ch[pos]==' ') pos++;
			}
		}
		DP(word_num);
		int k = 0;
		while(k < word_num) {
			int total = 0;
			for(i = k; i < k + line[k]; i++)
				total += len[i];
			if(line[k] == 1) {
				printf("%s\n", word[k]);
				k ++;
				continue;
			}
			int q = (width - total) / (line[k] - 1);
			int r = (width - total) % (line[k] - 1);
			for(i = k; i < k + line[k] - 1; i++) {
				printf("%s", word[i]);
				int space = q + (i >= k + line[k] - 1 - r);
				for (j=0; j<space; j++)
					putchar(' ');
			}
			printf("%s\n", word[line[k] + k - 1]);
			k += line[k];
		}
		printf("\n");
	}
	return 0;
}


zoj1149

#include<stdio.h>
#include<string.h>

int a[7];

void DP(int sum) {
	int i,j,k;
	int mid = sum/2;
	char visit[200];
	memset(visit,0,sizeof(visit));
	int t;
	visit[0] = 1;
	for(i=1; i<=6; i++)
		for(j=mid; j>=0; j--)
			if (visit[j])
				for(k=1; k<=a[i]; k++)
				{
					t = j+i*k;
					if (t>mid) break;
					else visit[t] = 1;
					if (t==mid) {
						printf("Can be divided.\n\n");
						return;
					}
				}
	printf("Can't be divided.\n\n");
}

int main()
{
	int i;
	int iCase = 1;
	while(1)
	{
		int sum = 0;
		for (i=1; i<=6; i++){
			scanf("%d",&a[i]);
			if(a[i]!=0 && a[i]%6==0) a[i] = 6;
			else a[i] = a[i]%6;
			sum += a[i]*i;
		}
		if (sum==0) break;
		printf("Collection #%d:\n", iCase++);
		if(sum%2) {
			printf("Can't be divided.\n\n");
			continue;
		}
		DP(sum);
	}
	return 0;
}


zoj1025

#include <stdio.h>
#include <math.h>

#define LN10 2.30258509299405

void Solved(char binary[])
{
	int i;
	unsigned char low, high;
	int expo;
	double mant;
	unsigned short floating;

	floating = 0;
	for(i = 0; i < 16; i++)
	{
		floating = (floating<<1);
		if(binary[i] == '1') floating++;
	}

	low = floating & 0x00FF; 
	high = floating>>8;
	if(floating == 0x8000 || floating == 0) 
		printf(" 0.000000e+000\n");
	else
	{
		if((floating & 0x8000) != 0) printf("-");
		else printf(" ");
		mant = (1+low/256.0)*pow(2.0, (high&0x7F)-63);
		expo = floor(log(mant)/LN10);
		mant = mant/pow(10.0, expo);
		printf("%.6lfe", mant);
		if(expo>=0) printf("+");
		else
		{
			printf("-"); 
			expo = -expo;
		}
		printf("%03d\n", expo);
	}
}

int main()
{
	char binary[20];
	printf("Program 6 by team X\n");
	while (scanf("%s", binary)!=EOF)
		Solved(binary);
	printf("End of program 6 by team X\n");
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值