学校作业-Usaco DP水题

本文介绍了USACO竞赛中的几道动态规划题目,包括集合划分、最长前缀、货币组合和邮票问题。通过解析题意和提供解题思路,展示了如何利用动态规划方法解决这些问题。例如,集合划分问题转化为背包问题,最长前缀问题通过判断序列是否能由给定集合组成,货币组合问题和邮票问题同样采用动态规划,考虑元素的重复使用情况。
摘要由CSDN通过智能技术生成

好吧,因为USACO挂掉了,所以我写的所有代码都不保证正确性【好的,这么简单的题,再不写对,你就可以滚粗了!

第一题是USACO 2.2.2

★Subset Sums 集合 
对于从 1 到 N 的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的. 
举个例子,如果 N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的: 
{3} and {1,2}  26
这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数) 
如果 N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的: 
{1,6,7} and {2,3,4,5} {注 1+6+7=2+3+4+5} 
{2,5,7} and {1,3,4,6} 
{3,4,7} and {1,2,5,6} 
{1,2,4,7} and {3,5,6} 
给出 N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出 0.程序不能预存结果
直接输出. 
PROGRAM NAME: subset 
INPUT FORMAT
输入文件只有一行,且只有一个整数 N 
SAMPLE INPUT (file subset.in) 

OUTPUT FORMAT
输出划分方案总数,如果不存在则输出 0. 
SAMPLE OUTPUT (file subset.out) 

——分割线——

这道题其实就是一个背包,就是求用1~n组合成(n+1)*n/4的方案数。我们记f[x]表示组成和为x我们的方案数,我们尝试每个数k,从(n+1)*n/4开始到k即为p寻找一旦p-k这个值可以通过1~k-1这些数组成,即f[p-k]!=0。那么,我们就使f[p]+=f[p-k],即每个可以组成p-k的方案在加上一个k就可以组成p的方案。

/*Author:WNJXYK*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;

#define LL long long

inline void swap(int &x,int &y){int tmp=x;x=y;y=tmp;}
inline void swap(LL &x,LL &y){LL tmp=x;x=y;y=tmp;}
inline int remin(int a,int b){if (a<b) return a;return b;}
inline int remax(int a,int b){if (a>b) return a;return b;}
inline LL remin(LL a,LL b){if (a<b) return a;return b;}
inline LL remax(LL a,LL b){if (a>b) return a;return b;}

const int Maxn=2000;
int n;
int Sum=0;
int f[Maxn+10];

int main(){
	scanf("%d",&n);
	Sum=(n+1)*n/2/2;
	f[0]=1;
	for (int i=n;i>=1;i--){
		for (int j=Sum;j>=i;j--){
			f[j]=f[j]+f[j-i];
		}
	}
	printf("%d\n",f[Sum]/2);
	return 0;
}
第二题是USACO 2.3.1

★Longest Prefix 最长前缀 
在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列 28
分解成较短的(称之为元素的)序列很感兴趣. 
如果一个集合 P 中的元素可以通过串联(允许重复;串联,相当于 Pascal 中的 “+” 运算符)
组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.并不是所有的元素都必须出现.
举个例子,序列 ABABACABAAB 可以分解为下面集合中的元素: 
 {A, AB, BA, CA, BBC} 
序列 S 的前面 K 个字符称作 S 中长度为 K 的前缀.设计一个程序,输入一个元素集合以及一个
大写字母序列,计算这个序列最长的前缀的长度. 
PROGRAM NAME: prefix 
INPUT FORMAT
输入数据的开头包括 1..200 个元素(长度为 1..10 )组成的集合,用连续的以空格分开的字符串
表示.字母全部是大写,数据可能不止一行.元素集合结束的标志是一个只包含一个 “.” 的行.集
合中的元素没有重复.接着是大写字母序列 S ,长度为 1..200,000 ,用一行或者多行的字符串来表
示,每行不超过 76 个字符.换行符并不是序列 S 的一部分. 
SAMPLE INPUT (file prefix.in) 
A AB BA CA BBC 
ABABACABAABC 
OUTPUT FORMAT
只有一行,输出一个整数,表示 S 能够分解成 P 中元素的最长前缀的长度. 
SAMPLE OUTPUT (file prefix.out) 
11 

——分割线——

这道题我也没仔细想,脑不了个方法写出啦就好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值